我使用 SQL Server,我想有一个当前年份的表,其中显示今年的所有月份,即使值为 0。
结果显示给我:
Month Summe maschnr
-------------------------
1 300 23
这是我今年想要的例子:
Month Summe maschnr.
------------------------
1 300 23
2 0 23
3 0 23
4 0 23
5 0 23
6 0 23
7 0 23
8 0 23
9 0 23
10 0 23
11 0 23
12 0 23
你能帮我吗?
我的查询是
SELECT
masch_nr,
CONVERT(DECIMAL(10, 2), SUM(gut_pri) / 1000) AS summe,
MONTH(begin_ts) AS Monat
FROM
[hydra1].[hydadm].[v_ade_protokoll]
WHERE
masch_nr = 'FIMI3'
AND satz_art = 'T'
AND YEAR(begin_ts) = '2021'
GROUP BY
masch_nr, MONTH(begin_ts)
谢谢
答案 0 :(得分:2)
您需要填补不存在的数据的空白。您表格中的哪一行可能会输出二月?
DECLARE @year int = 2021;
;WITH n AS
(
SELECT m FROM (VALUES(1),(2),(3),(4)) AS m(m)
),
m(m) AS
(
SELECT TOP (12) DATEFROMPARTS(@year, ROW_NUMBER() OVER (ORDER BY n.m), 1)
FROM n CROSS JOIN n AS n2
)
SELECT [Month] = MONTH(m.m),
CONVERT(DECIMAL(10,2),SUM(ap.gut_pri)/1000) AS summe,
ap.masch_nr
FROM m
LEFT OUTER JOIN hydra1.hydadm.v_ade_protokoll AS ap
ON ap.begin_ts >= m.m
AND ap.begin_ts < DATEADD(MONTH,1,m.m)
AND ap.masch_nr = 'FIMI3'
AND ap satz_art = 'T'
GROUP BY m.m,
ap.masch_nr -- do you really need this? There can only be one
ORDER BY m.m;
答案 1 :(得分:1)
如果您的表不包含接下来几个月的行,您需要在查询中引入一些值。 也许是这样的:
SELECT MONTHS.N AS Monat, COALESCE(RESULT.summe,0) AS summe, RESULT.masch_nr
FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) AS MONTHS(N)
OUTER APPLY (
SELECT masch_nr, CONVERT(DECIMAL(10,2),SUM(gut_pri)/1000) as summe
FROM [hydra1].[hydadm].[v_ade_protokoll]
WHERE masch_nr='FIMI3'
AND satz_art='T'
AND YEAR(begin_ts)='2021'
AND MONTH(begin_ts) = MONTHS.N
GROUP BY masch_nr
) AS RESULT
答案 2 :(得分:0)
可以创建一个表来存储一年中的月份并通过左连接与查询相关
例如:
Create table dbo.tMonth (
nuMonth INT,
nmMonth nvarchar(20),
abbMonth nvarchar(3)
)
insert into dbo.tMonth values(1,'January','jan')
insert into dbo.tMonth values(2,'febrary','fev')
insert into dbo.tMonth values(3,'March','mar')
insert into dbo.tMonth values(4,'April','apr')
insert into dbo.tMonth values(5,'May','may')
insert into dbo.tMonth values(6,'June','jun')
insert into dbo.tMonth values(7,'July','jul')
insert into dbo.tMonth values(8,'August','ago')
insert into dbo.tMonth values(9,'September','set')
insert into dbo.tMonth values(10,'October','out')
insert into dbo.tMonth values(11,'November','nov')
insert into dbo.tMonth values(12,'December','dec')
SELECT masch_nr, ISNULL(summe,0) summe,Monat FROM dbo.tMonth m left join (
SELECT masch_nr, CONVERT(DECIMAL(10,2),SUM(gut_pri)/1000) as summe,
MONTH(begin_ts) as Monat
FROM [hydra1].[hydadm].[v_ade_protokoll]
WHERE masch_nr='FIMI3'
AND satz_art='T'
AND YEAR(begin_ts)='2021'
GROUP BY masch_nr, MONTH(begin_ts) ) as q
ON m.nuMonth = q.Monat