【问题标题】:Replacing no rows with 0 value没有用 0 值替换任何行
【发布时间】:2018-09-11 10:28:25
【问题描述】:

我有以下查询

SELECT    DATEPART(YEAR, Date_Reported) AS 'Year',
          DATEPART(MONTH, Date_Reported) AS 'Month',
          DATEPART(DAY, Date_Reported) AS 'Day',
          COUNT(*) AS 'Transactions'
FROM TX
WHERE Date_Reported >= DATEADD(day,-7, GETDATE())
GROUP BY  DATEPART(DAY, Date_Reported),
          DATEPART(MONTH, Date_Reported),
          DATEPART(YEAR, Date_Reported)
ORDER BY  'Year',
          'Month',
          'Day'

它给我的是最近 7 天的交易,但是当一天的交易为 0 时,它不会显示一行。我想要的是没有行在事务列下显示为 0 值,如下所示:

YEAR | MONTH | DAY | TRANSACTIONS
2018 | 9     | 4   |     2
2018 | 9     | 5   |     2
2018 | 9     | 6   |     0
2018 | 9     | 7   |     5
2018 | 9     | 8   |     2
2018 | 9     | 9   |     0
2018 | 9     | 10  |     0

有什么想法吗?

【问题讨论】:

标签: sql-server


【解决方案1】:

这里是解决方案,

首先,您必须创建日期表作为基表,因为您在 TX 中没有一些日期记录,因为您显示为 0。 根据以下查询,您可以创建该表并将其存储到临时表中。

;WITH cte AS (
SELECT cast(GETDATE() as date) AS myDate
UNION ALL
SELECT cast( DATEADD(DAY,-1,myDate) as date)
FROM cte
where myDate >= DATEADD(day,-7, GETDATE())
)
SELECT myDate Into #dateTable
FROM cte

其次,您可以使用 Left Join #dateTable 和 Your TX,如下所示。

select DATEPART(YEAR, myDate) AS 'Year',
       DATEPART(MONTH, myDate) AS 'Month',
       DATEPART(DAY, myDate) AS 'Day',
       Count(Date_Reported) as 'Transactions'
from #dateTable
LEFT JOIN #Tempdata on CAST(Date_Reported as DATE) = CASt(myDate as date)
GROUP BY  DATEPART(DAY, myDate),
          DATEPART(MONTH, myDate),
          DATEPART(YEAR, myDate)
ORDER BY  'Year',
          'Month',
          'Day'

【讨论】:

    【解决方案2】:

    这是一种可能的解决方案:

    WITH LastDays AS --Base table
    (
      SELECT CAST(DATEADD(DAY,-D,SYSDATETIME()) AS Date) D FROM (VALUES (0),(1),(2),(3),(4),(5),(6)) T(D)
    ), TX AS --Demo data
    (
      SELECT * FROM (VALUES
      (CAST(SYSDATETIME() AS Date)),
      (CAST(DATEADD(DAY,-2,SYSDATETIME()) AS Date))
      ) T(Date_Reported)
    )
    SELECT    DATEPART(YEAR, D) AS 'Year',
              DATEPART(MONTH, D) AS 'Month',
              DATEPART(DAY, D) AS 'Day',
              COUNT(Date_Reported) AS 'Transactions'
    FROM LastDays
    LEFT JOIN TX ON Date_Reported=D
    GROUP BY  DATEPART(DAY, D),
              DATEPART(MONTH, D),
              DATEPART(YEAR, D)
    ORDER BY  'Year',
              'Month',
              'Day'
    

    【讨论】:

    • 嗨,谢谢,这个查询是动态的,因为我看到正在使用的演示数据?基本上不需要我手动编辑演示数据就可以了
    • 我没有 TX 表,所以我必须模拟它。您可以省略此部分并使用真实表格。还要确保使用Datedata 类型(不是DateTimeDateTime2)在比较中忽略小时、分钟和秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2021-08-31
    相关资源
    最近更新 更多