1

假设有这张表存储每天的访问者数量。

当我想查询表并从中创建图表时,就会出现问题。

没有活动的日子在表格上没有相应的行。

例如

Day1 - 7
Day2 - 8
Day4 - 7

并且生成的图表将不正确。因为第 3 天需要 0。

现在,不使用 SQL 以外的任何东西就可以为不活动的日子创建这些值吗?

我想创建另一个表,该表将在每次执行脚本时创建 30 天的所有日期,并且问题将得到解决,但我想知道是否有更实用的解决方案。

提前致谢。

4

4 回答 4

1

您使用 30 天创建表格的解决方案是一个非常简单实用的解决方案。

如果你真的想的话,你可以在没有额外桌子的情况下做到这一点,但这并不令人愉快。SQL 并不是真正设计为允许您选择数据库中不存在的数据。一般来说,一个更简单的解决方案是在客户端添加丢失的行,而不是尝试编写复杂的 SQL 语句来执行此操作。

于 2010-04-22T18:26:21.693 回答
1

使用 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
于 2010-04-22T18:36:55.183 回答
1

我不会只调用这个 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
于 2010-04-22T18:53:24.413 回答
0

不,没有标准方法仅使用 SQL 将不确定数量的缺失行添加到 SQL 查询的结果中,而无需先将这些行存储在表中。

您可以拥有一个包含应用程序将运行的所有日期的单个表,或者您可以拥有一个仅将当前查询将使用的日期放入其中的表。如果您选择第二种解决方案,请记住计划让不同用户同时使用不同的日期范围执行相同的查询——如果您的 DBMS 支持,您将希望该表是临时的和特定于用户的。

于 2010-04-22T18:35:12.017 回答