SQL Server:行为每月,列为年

SQL Server:行为每月,列为年,sql,sql-server,Sql,Sql Server,我是一个试图按年份整齐地分隔数据的人,下面的查询实现了这一点,但是,date列(YYYYMM)显示了每年的每个月。因此,除了相应年份的行外,大多数行的每个年度列都是零 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'

我是一个试图按年份整齐地分隔数据的人,下面的查询实现了这一点,但是,date列(YYYYMM)显示了每年的每个月。因此,除了相应年份的行外,大多数行的每个年度列都是零

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)
我想做的是只做12行(每个月1行)。像这样:

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

学会使用正确、明确、标准、可读的连接语法

然后,修复方法是只需通过更改
组并选择

 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);

我还删除了一堆单引号。单引号只能用于日期和字符串常量
YEAR()
返回一个数字,因此比较应该是一个数字。列别名实际上不需要转义,但如果名称不一致,则使用方括号。单引号将列名与值混淆。

Beautiful!非常感谢-在ANSI-92 SQL标准中(25多年前),旧式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,因此不鼓励使用它