1. 程式人生 > 其它 >mysql sum函式中對兩欄位做運算時有null時的情況

mysql sum函式中對兩欄位做運算時有null時的情況

背景

在針對一些資料進行統計彙總的時候,有時會對錶中的某些欄位進行邏輯運算,如加減乘除,如果要求和的話還可能會用到sum函式,如果兩者結合起來應該怎麼處理,如果參與運算的欄位中出現null值的時候會出現一些什麼情況。

問題

CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `name` varchar(20) NOT NULL COMMENT '名稱',
  `total_amount` int(11) DEFAULT NULL COMMENT '賬戶總金額',
  `freeze_amount` int(11) DEFAULT NULL COMMENT '凍結金額',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

資料如下

如上表所示,使用者資訊表中有賬戶總金額和凍結金額欄位,我們現在想要計算可用金額,根據業務場景可用金額 = total_amount - freeze_amount,如果此時要彙總計算表中所有資料的可用金額總和,我們可以寫如下SQL。

根據表中的資料,我們知道統計後正確的結果應該是

(2000 - 50) +(1500 - 100) +(500 - 50) +1000 = 4800

但如果我們這麼寫,那麼得到的結果是錯誤的。

select sum(total_amount - freeze_amount) from user

(2000 - 50) +(1500 - 100) +(500 - 50) +(1000 - null) = 3800

因為1000 - null的結果不是1000而是null,因為null與任何值比較和運算的結果都是null,所以我們應該針對null做特殊處理。

需要主要這樣寫也是沒有用的,因為裡面1000-null,仍然是一個錯誤的結果

select ifnull(sum(total_amount - freeze_amount),0) from user 

正確的寫法應該是

select ifnull(sum(total_amount),0) - ifnull(sum(freeze_amount),0) from user

本篇文章如有幫助到您,請給「翎野君」點個贊,感謝您的支援。