这是一个我不确定是否曾经遇到过的问题(坦率地说,它不存在)。我正在按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”]
我已经尝试过IIF和NULLIF和ISNULL,但无济于事。如果有人知道可以帮助我的窍门,将不胜感激。
它们未显示,因为它们在您的源表中不可用。
解决此问题的一个方法是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
Don't used in where final_reported_date IS NULL it will get all the data