首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 行轉列:CASE WHEN + SUM 實現年份月份交叉統計

     編輯:程式設計綜合問答

需求:按月份統計 2014、2015 年總金額,輸出格式:Month | 2014 | 2015。

原始表結構

Statistics
- Month (int)
- Year (int)   -- 2014, 2015
- TotalPrice (decimal)

單條 SQL 實現

SELECT
    Month,
    SUM(CASE WHEN Year = 2014 THEN TotalPrice ELSE 0 END) AS Total_2014,
    SUM(CASE WHEN Year = 2015 THEN TotalPrice ELSE 0 END) AS Total_2015
FROM Statistics
GROUP BY Month
ORDER BY Month;

原理

  • CASE WHEN Year = 2014 THEN TotalPrice ELSE 0 END:將 2014 年金額保留,其他年份置 0。
  • SUM(...):按月份分組後求和,自動過濾掉 0 值,得到該月 2014 總額。
  • 同理得到 2015 列。
  • GROUP BY Month:按月份聚合。

動態年份擴展 (MySQL/PostgreSQL)

SELECT Month,
    SUM(CASE WHEN Year = 2014 THEN TotalPrice END) AS `2014`,
    SUM(CASE WHEN Year = 2015 THEN TotalPrice END) AS `2015`
FROM Statistics
GROUP BY Month;
-- ELSE 0 可省略,SUM 忽略 NULL

SQL Server PIVOT 寫法

SELECT Month, [2014], [2015]
FROM (
    SELECT Month, Year, TotalPrice FROM Statistics
) src
PIVOT (
    SUM(TotalPrice) FOR Year IN ([2014], [2015])
) pvt
ORDER BY Month;

結果示例

Month | 2014       | 2015
1     | 12500.00   | 15800.00
2     | 9800.00    | 11200.00
...
12    | 18600.00   | 20100.00

CASE WHEN + SUM 兼容性最強,無需 PIVOT 語法支援,推薦通用方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved