将数据库SSRS中不存在的数据填写为零

问题描述 投票:0回答:1
学年 一月 二月 三月 四月 五月 六月 七月 八月
2022-2023 5 9 4 6 3 2 1 8
2023-2024 4 3 7 6 4 1 1 2
2024-2025 3 11 5 4 4 2 7 5

我在 SSRS 中使用了一个矩阵,其中学年作为行,月份作为数据,计数(学生)作为列。

参考 SQL Server 2019 和 2022 SSRS

我有一个选择查询:

Select schoolname, datename(month, date_01) as month, student name, schoolyear
from table 1 q
join
table 2
on
q.(column)=w.(column)
where schoolyear in ('2022-2023','2023-2024','2024-2025')
group by .......
order by .....

date_01 的格式为 yyyy/mm/dd,我将其转换为月份。

我使用学校名称作为参数,根据我的数据更改选择学校。

显示的数字是不同月份注册的学生姓名的统计。

现在ABC学校只有一月到八月的数据,之后就没有学生注册了。基本上所有学校都有变化,所以没有固定模式。

学年 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月
2022-2023 5 9 4 6 3 2 1 8 0 0 0 0
2023-2024 4 3 7 6 4 1 1 2 0 0 0 0
2024-2025 3 11 5 4 4 2 7 5 0 0 0 0

我不记得如何做到这一点。对于拥有所有月份数据的学校来说是可以的,但仅拥有几个月数据的学校很难将其他月份的数据显示为零,因为它们没有数据。我可以在 SQL Server 脚本或 SSRS 中做些什么吗?

sql-server t-sql reporting-services
1个回答
0
投票

一种可接受的方法是创建一个日历表作为基表并相应地左连接数据。下面的代码片段实现了同样的效果。

DECLARE @StartYear INT = 2022
DECLARE @EndYear INT = 2024 

;WITH R1(N) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
R2(N) AS (SELECT 1 FROM R1 a, R1 b),
R3(N) AS (SELECT 1 FROM R2 a, R2 b), 
Tally(Number) AS (SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM R3)

SELECT  
    CASE WHEN (Number % 12) = 0 THEN 12 ELSE (Number % 12) END AS [Month],
    ROW_NUMBER() OVER (PARTITION BY Number % 12 ORDER BY Number) + @StartYear -1 AS StartYear,
    ROW_NUMBER() OVER (PARTITION BY Number % 12 ORDER BY Number) + @StartYear  AS EndYear
FROM 
    Tally
ORDER BY Number


Select schoolname, datename(month, date_01) as month, student name, schoolyear
from 
Tally cal
left join
table 1 q on datepart(month, date_01) = cal.[Month] and datepart(year, date_01)  cal.[startyear]
left join
table 2
on
q.(column)=w.(column)
where cal.schoolyear in ('2022-2023','2023-2024','2024-2025')
group by .......
order by .....
© www.soinside.com 2019 - 2024. All rights reserved.