簡體   English   中英

SQL 服務器:每月為行,每年為列

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

我試圖按年份巧妙地分離數據,我有以下查詢來完成此操作,但是,日期列 (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

學習使用正確的、明確的、標准的、可讀的JOIN語法。

然后,解決方法是更改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);

我還刪除了一堆單引號。 單引號應僅用於日期和字符串常量。 YEAR()返回一個數字,所以比較應該是一個數字。 列別名確實不需要轉義,但是如果您有不符合要求的名稱,請使用方括號。 單引號將列名與值混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM