为什么汇总的GROUPBY()COUNT(*)不会显示为0?

问题描述 投票:1回答:2

这是一个我不确定是否曾经遇到过的问题(坦率地说,它不存在)。我正在按YEAR和MONTH分组进行每月时间序列分析,但输出中未显示COUNT的0。这是查询:

SELECT
    ROW_NUMBER() OVER(
        ORDER BY YEAR(order_date), MONTH(order_date)) AS 'Index',
    YEAR(order_date) AS 'Year',
    MONTH(order_date) AS 'Month',
    CONCAT(CASE
                WHEN MONTH(order_date) = 1 THEN 'Jan'
                WHEN MONTH(order_date) = 2 THEN 'Feb'
                WHEN MONTH(order_date) = 3 THEN 'Mar'
                WHEN MONTH(order_date) = 4 THEN 'Apr'
                WHEN MONTH(order_date) = 5 THEN 'May'
                WHEN MONTH(order_date) = 6 THEN 'Jun'
                WHEN MONTH(order_date) = 7 THEN 'Jul'
                WHEN MONTH(order_date) = 8 THEN 'Aug'
                WHEN MONTH(order_date) = 9 THEN 'Sep'
                WHEN MONTH(order_date) = 10 THEN 'Oct'
                WHEN MONTH(order_date) = 11 THEN 'Nov'
                WHEN MONTH(order_date) = 12 THEN 'Dec'
            END,
            ' ',
            YEAR(order_date)) AS 'Timeline',
    COUNT(*) AS 'Pending Cases'
FROM dbo.result_management_report
WHERE final_reported_date IS NULL
AND order_type = 'Commercial'
AND test_name = 'CTC-FISH'
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY YEAR(order_date), MONTH(order_date)

这里是输出。您可以看到缺少2020年1月的情况,而未决案件为“ 0”]

sqloutput

我已经尝试过IIF和NULLIF和ISNULL,但无济于事。如果有人知道可以帮助我的窍门,将不胜感激。

sql-server date group-by count recursive-query
2个回答
0
投票

它们未显示,因为它们在您的源表中不可用。

解决此问题的一个方法是left join可以使用递归cte生成的固定日期列表:

with all_dates as (
    select 
        datefromparts(year(min(orderdate)), month(min(orderdate)), 1) dt
        datefromparts(year(max(orderdate)), max(min(orderdate)), 1) maxdt
    from dbo.result_management_report
    union all
    select dateadd(month, 1, dt), maxdt 
    from all_dates
    where dt < maxdt
)
select  
    row_number() over(order by d.dt) as idx,
    d.dt start_of_month,
    count(r.orderdate) pending_cases
from all_dates d
left join bo.result_management_report r 
    on  r.orderdate >= d.dt 
    and r.orderdate <  dateadd(month, 1, d.dt)
    and r.final_reported_date is null
    and r.order_type = 'commercial'
    and r.test_name = 'ctc-fish'
group by d.dt

0
投票
Don't used in where final_reported_date IS NULL it will get all the data
© www.soinside.com 2019 - 2024. All rights reserved.