【问题标题】:Return 0 for NULL values in a simple count and group by date以简单计数和按日期分组的 NULL 值返回 0
【发布时间】:2014-12-03 01:33:03
【问题描述】:

我正在对 SSRS 图表进行简单的计数查询,虽然这看起来是一个常见问题,但我还没有真正找到适合我情况的答案。这是我的查询:

SELECT TOP 30       CAST(qa.Created As Date) As 'Date',
                    COUNT(qa.Created) As 'Count'
FROM                QAs qa
GROUP BY            CAST(qa.Created As Date)
ORDER BY            'Date' DESC

这会返回类似:

Date       | Count

2014-11-10 | 2

2014-11-08 | 3

2014-11-07 | 8

当放入折线图中时,不会在 9 日显示下降到 0,这让我的用户有点困惑。我想要做的是按顺序显示过去 30 天的所有内容,即使它们为 0。我被告知要使用 COALESCE() 执行此操作,但我似乎也无法正常工作。我哪里错了?

【问题讨论】:

  • 我认为日历表会有所帮助。

标签: sql-server tsql reporting-services ssrs-2008


【解决方案1】:

使用Recursive CTE 生成过去 30 天的日期。

;WITH cte
     AS (SELECT Cast(dateadd(day,-30,Getdate()) AS DATE) AS dates
         UNION ALL
         SELECT Dateadd(day, 1, dates)
         FROM   cte
         WHERE  dates < cast(Getdate() as date)
SELECT a.Dates           AS [Date],
       Count(qa.Created) AS [Count]
FROM   cte a
       LEFT JOIN QAs qa
              ON a.dates = Cast(qa.Created AS DATE)
GROUP  BY a.Dates 
ORDER  BY a.Dates 

【讨论】:

  • 好的,这很好用。非常感谢你!但是......我已经将这个相同的脚本与另一个基本相同的查询一起使用,除了我添加了一个 WHERE 子句来为每个用户运行报告。现在,它返回所有计数,并且像以前一样省略了零。我不明白为什么要为此添加 WHERE 子句。有什么想法吗?
【解决方案2】:

我可能会选择 NoDisplayName 的递归 CTE,但如果您碰巧遇到了 2005 年之前的某件事,而我已经很久了。

--Build a table of dates
DECLARE @dates AS TABLE([date] date)
DECLARE @i int

SET @i = 30

WHILE @i > 0
BEGIN
    INSERT INTO @dates([date])
    SELECT DATEADD(d, -1 * @i, GETDATE())
    SET @i = (@i - 1)
END


--Join into those dates so that no date is excluded
SELECT [date], SUM(dateCount)
FROM (
    SELECT d.[date], CASE WHEN qa.Created IS NULL THEN 0 ELSE 1 END AS dateCount
    FROM @dates d
        LEFT JOIN QAs qa ON CAST(qa.Created AS date) = d.[date]
) AS dateCounts
GROUP BY [date]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多