首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 行列轉換(透視表)實戰:SUM+IF+GROUP BY 實現動態列

     編輯:MySQL 綜合教學

MySQL 行列轉換(透視表)實戰:SUM+IF+GROUP BY 實現動態列

1. 準備測試數據

CREATE TABLE `gas` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `oil` VARCHAR(100) DEFAULT NULL,
  `district` VARCHAR(100) DEFAULT NULL,
  `price` DOUBLE DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO gas (oil, district, price) VALUES
('#0','寶安',11), ('#0','福田',12), ('#0','羅湖',13),
('#93','寶安',21), ('#93','福田',22), ('#93','羅湖',23),
('#97','寶安',31), ('#97','福田',32), ('#97','羅湖',33);

原始數據(行式):

idoildistrictprice
1#0寶安11
2#0福田12
3#0羅湖13
4#93寶安21
5#93福田22
6#93羅湖23
7#97寶安31
8#97福田32
9#97羅湖33

2. 行轉列核心 SQL

SELECT 
    IFNULL(oil, 'total') AS oil,
    SUM(IF(district='寶安', price, 0)) AS BA,
    SUM(IF(district='福田', price, 0)) AS FT,
    SUM(IF(district='羅湖', price, 0)) AS LH,
    SUM(price) AS TOTAL
FROM gas
GROUP BY oil WITH ROLLUP;

3. 執行結果(列式透視表)

oilBAFTLHTOTAL
#011121336
#9321222366
#9731323396
total636669198

4. 關鍵點解析

  • IF(condition, true_val, false_val):條件聚合,將行屬性轉為列
  • SUM():聚合計算各分組值
  • GROUP BY oil WITH ROLLUP:分組並生成總計行
  • IFNULL(oil, 'total'):將 ROLLUP 產生的 NULL 顯示為 'total'

此模式適用於銷售報表、庫存統計、多維度數據分析等場景。

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