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);
原始數據(行式):
| id | oil | district | price |
|---|---|---|---|
| 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 |
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;
| oil | BA | FT | LH | TOTAL |
|---|---|---|---|---|
| #0 | 11 | 12 | 13 | 36 |
| #93 | 21 | 22 | 23 | 66 |
| #97 | 31 | 32 | 33 | 96 |
| total | 63 | 66 | 69 | 198 |
IF(condition, true_val, false_val):條件聚合,將行屬性轉為列SUM():聚合計算各分組值GROUP BY oil WITH ROLLUP:分組並生成總計行IFNULL(oil, 'total'):將 ROLLUP 產生的 NULL 顯示為 'total'此模式適用於銷售報表、庫存統計、多維度數據分析等場景。