查询只返回当前月份

时间:2021-01-26 21:51:59

标签: sql-server

我使用 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)

谢谢

3 个答案:

答案 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