假设有这张表存储每天的访问者数量。
当我想查询表并从中创建图表时,就会出现问题。
没有活动的日子在表格上没有相应的行。
例如
Day1 - 7
Day2 - 8
Day4 - 7
并且生成的图表将不正确。因为第 3 天需要 0。
现在,不使用 SQL 以外的任何东西就可以为不活动的日子创建这些值吗?
我想创建另一个表,该表将在每次执行脚本时创建 30 天的所有日期,并且问题将得到解决,但我想知道是否有更实用的解决方案。
提前致谢。
假设有这张表存储每天的访问者数量。
当我想查询表并从中创建图表时,就会出现问题。
没有活动的日子在表格上没有相应的行。
例如
Day1 - 7
Day2 - 8
Day4 - 7
并且生成的图表将不正确。因为第 3 天需要 0。
现在,不使用 SQL 以外的任何东西就可以为不活动的日子创建这些值吗?
我想创建另一个表,该表将在每次执行脚本时创建 30 天的所有日期,并且问题将得到解决,但我想知道是否有更实用的解决方案。
提前致谢。
您使用 30 天创建表格的解决方案是一个非常简单实用的解决方案。
如果你真的想的话,你可以在没有额外桌子的情况下做到这一点,但这并不令人愉快。SQL 并不是真正设计为允许您选择数据库中不存在的数据。一般来说,一个更简单的解决方案是在客户端添加丢失的行,而不是尝试编写复杂的 SQL 语句来执行此操作。
使用 Sql Server 2005+ 和 CTE 递归(使用公用表表达式)你可以尝试
DECLARE @Table TABLE(
DateVal DATETIME,
Visists INT
)
INSERT INTO @Table SELECT '01 Jan 2010', 10
INSERT INTO @Table SELECT '03 Jan 2010', 1
INSERT INTO @Table SELECT '05 Jan 2010', 30
INSERT INTO @Table SELECT '10 Jan 2010', 50
;WITH MinMax AS (
SELECT MIN(DateVal) Startdate,
MAX(DateVal) EndDate
FROM @Table
),
DateRange AS(
SELECT StartDate DateVal
FROM MinMax
UNION ALL
SELECT DateRange.DateVal + 1
FROM DateRange,
MinMax
WHERE DateRange.DateVal + 1 <= MinMax.EndDate
)
SELECT DateRange.DateVal,
ISNULL(t.Visists,0) TotalVisits
FROM DateRange LEFT JOIN
@Table t ON DateRange.DateVal = t.DateVal
输出为
DateVal TotalVisits
----------------------- -----------
2010-01-01 00:00:00.000 10
2010-01-02 00:00:00.000 0
2010-01-03 00:00:00.000 1
2010-01-04 00:00:00.000 0
2010-01-05 00:00:00.000 30
2010-01-06 00:00:00.000 0
2010-01-07 00:00:00.000 0
2010-01-08 00:00:00.000 0
2010-01-09 00:00:00.000 0
2010-01-10 00:00:00.000 50
我不会只调用这个 SQL,因为它使用 PostgreSQL 特定的函数——但在你使用的任何数据库中都可能有类似的东西。
PostgreSQL 有一个很好的功能:generate_series
您可以使用此功能创建一系列 30 天。
select current_date + s.a as dates from generate_series(0,30) as s(a);
dates
------------
2010-04-22
2010-04-23
2010-04-24
(.. etc ..)
然后,您可以在查询中使用它,例如:
select vpd.visits, temp.dates
from (select current_date + s.a as dates from generate_series(0,30) as s(a)) as temp
left outer join visits_per_day vpd on vpd.day = temp.dates
visits | dates
--------+------------
10 | 2010-04-22
| 2010-04-23
20 | 2010-04-24
| 2010-04-25
| 2010-04-26
30 | 2010-04-27
不,没有标准方法仅使用 SQL 将不确定数量的缺失行添加到 SQL 查询的结果中,而无需先将这些行存储在表中。
您可以拥有一个包含应用程序将运行的所有日期的单个表,或者您可以拥有一个仅将当前查询将使用的日期放入其中的表。如果您选择第二种解决方案,请记住计划让不同用户同时使用不同的日期范围执行相同的查询——如果您的 DBMS 支持,您将希望该表是临时的和特定于用户的。