SQL Server:行为每月,列为年
我是一个试图按年份整齐地分隔数据的人,下面的查询实现了这一点,但是,date列(YYYYMM)显示了每年的每个月。因此,除了相应年份的行外,大多数行的每个年度列都是零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'
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多年前),旧式的逗号分隔表列表样式被正确的ANSIJOIN
语法所取代,因此不鼓励使用它