首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 條件聚合:SUM 搭配 IF / CASE 實現正負金額統計

     編輯:MySQL 資料庫相關知識

需求:同一張表記錄收支,stype=4 代表支出(金額需轉負),其他為收入。要按 name 分組並計算淨額。

方案一:CASE WHEN(標準 SQL,可攜性佳)

SELECT `name`,
       SUM(CASE WHEN `stype` = 4 THEN `money` * -1 ELSE `money` END) AS net_amount
FROM `account_book`
GROUP BY `name`;

方案二:IF 函數(MySQL 專用,語法更簡潔)

SELECT `name`,
       SUM(`money` * IF(`stype` = 4, -1, 1)) AS net_amount
FROM `account_book`
GROUP BY `name`;

方案三:NULLIF + 乘法(進階技巧)

SELECT `name`,
       SUM(`money` * (1 - 2 * (`stype` = 4))) AS net_amount
FROM `account_book`
GROUP BY `name`;

原理:MySQL 布林運算 stype=4 為真時回傳 1,假為 0;1 - 2*1 = -1,1 - 2*0 = 1。

效能對比

  • 三者在 MySQL 內部執行計劃幾乎相同,IF 與 CASE 皆為標量運算,開銷可忽略。
  • 真正影響效能的是 GROUP BY 分組鍵的基數與是否用到索引。
  • 建議:優先考慮可讀性,團隊習慣用 CASE 就用 CASE,習慣 IF 就用 IF。

擴展:多條件聚合

SELECT `name`,
       SUM(IF(`stype` = 1, `money`, 0)) AS income,
       SUM(IF(`stype` = 4, `money`, 0)) AS expense,
       SUM(IF(`stype` = 4, -`money`, `money`)) AS net
FROM `account_book`
GROUP BY `name`;

條件聚合是報表查詢的核心技巧,善用 SUM(IF(...)) / SUM(CASE...) 可避免多次掃表。

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