简体   繁体   English

SQL 服务器:每月为行,每年为列

[英]SQL Server : each month for the rows and the years for the columns

I am a trying to neatly separate data by year, I have the following query that accomplishes this, however, the date column (YYYYMM) shows every month of every year.我试图按年份巧妙地分离数据,我有以下查询来完成此操作,但是,日期列 (YYYYMM) 显示每年的每个月。 So each annual column is zeros for most rows except the ones for its respective year.因此,除了其各自年份的行之外,大多数行的每个年度列都是零。

SELECT      
    DATEFROMPARTS(YEAR(l.Date), MONTH(l.Date), 01) AS YYYYMM,
    SUM(CASE WHEN l.State ='UT' AND YEAR(l.Date) = '2018' THEN 1 ELSE 0 END) AS 'UT - 2018',
    SUM(CASE WHEN l.State ='UT' AND YEAR(l.Date) = '2019' THEN 1 ELSE 0 END) AS 'UT - 2019',
    SUM(CASE WHEN l.State ='UT' AND YEAR(l.Date) = '2020' THEN 1 ELSE 0 END) AS 'UT - 2020',
    SUM(CASE WHEN l.State ='AZ' AND YEAR(l.Date) = '2018' THEN 1 ELSE 0 END) AS 'AZ - 2018',
    SUM(CASE WHEN l.State  ='AZ' AND YEAR(l.Date) = '2019' THEN 1 ELSE 0 END) AS 'AZ - 2019',
    SUM(CASE WHEN l.State ='AZ' AND YEAR(l.Date) = '2020' THEN 1 ELSE 0 END) AS 'AZ - 2020',
    SUM(CASE WHEN l.State ='NV' AND YEAR(l.Date) = '2020' THEN 1 ELSE 0 END) AS 'NV - 2020'
FROM
    dbo.list AS l,
    dbo.StatusLogs AS sl
WHERE
    sl.ListId = l.Id
GROUP BY    
    DATEFROMPARTS(YEAR(l.Date), MONTH(l.Date), 01)
ORDER BY    
    DATEFROMPARTS(YEAR(l.Date), MONTH(l.Date), 01)

What I am trying to do is to just have 12 rows (1 row for each month).我想要做的是只有 12 行(每个月 1 行)。 Like this:像这样:

MM       UT - 2018     ....     NV - 2020
Jan        10                     5
Feb        5                      8
...
Dec        6                      7

Learn to use proper, explicit, standard , readable JOIN syntax.学习使用正确的、明确的、标准的、可读的JOIN语法。

Then, the fix is to just change the GROUP BY and SELECT :然后,解决方法是更改GROUP BYSELECT

 SELECT MONTH(l.Date) AS month,
        SUM(CASE WHEN l.State ='UT' AND YEAR(l.Date) = 2018 THEN 1 ELSE 0 END) AS [UT - 2018],
        SUM(CASE WHEN l.State ='UT' AND YEAR(l.Date) = 2019 THEN 1 ELSE 0 END) AS [UT - 2019],
        SUM(CASE WHEN l.State ='UT' AND YEAR(l.Date) = 2020 THEN 1 ELSE 0 END) AS [UT - 2020],
        SUM(CASE WHEN l.State ='AZ' AND YEAR(l.Date) = 2018 THEN 1 ELSE 0 END) AS [AZ - 2018],
        SUM(CASE WHEN l.State  ='AZ' AND YEAR(l.Date) = 2019 THEN 1 ELSE 0 END) AS [AZ - 2019],
        SUM(CASE WHEN l.State ='AZ' AND YEAR(l.Date) = 2020 THEN 1 ELSE 0 END) AS [AZ - 2020],
        SUM(CASE WHEN l.State ='NV' AND YEAR(l.Date) = 2020 THEN 1 ELSE 0 END) AS [NV - 2020]
 FROM dbo.list l JOIN
      dbo.StatusLogs sl
      ON sl.ListId = l.Id
 GROUP BY MONTH(l.Date)
 ORDER BY MONTH(l.Date);

I also removed a bunch of single quotes.我还删除了一堆单引号。 Single quotes should be used only for date and string constants.单引号应仅用于日期和字符串常量。 YEAR() returns a number, so the comparison should be a number. YEAR()返回一个数字,所以比较应该是一个数字。 Column aliases should really not need to be escaped, but if you have non-conforming names, then use square braces.列别名确实不需要转义,但是如果您有不符合要求的名称,请使用方括号。 Single quotes confuses the column name with a value.单引号将列名与值混淆。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM