需求:同一張表記錄收支,stype=4 代表支出(金額需轉負),其他為收入。要按 name 分組並計算淨額。
SELECT `name`,
SUM(CASE WHEN `stype` = 4 THEN `money` * -1 ELSE `money` END) AS net_amount
FROM `account_book`
GROUP BY `name`;
SELECT `name`,
SUM(`money` * IF(`stype` = 4, -1, 1)) AS net_amount
FROM `account_book`
GROUP BY `name`;
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。
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...) 可避免多次掃表。