SQL 條件求和


SUMIF

就是 Excel 中的 sumif () 函數的功能. 工作中用的頻率極其高, 像我就幾乎天天在用的呢. 也是做個簡單的筆記而已. 為啥我總是喜歡對比 Excel 呢, 因為我也漸漸發現, Excel 是業務小姐姐和開發人員 唯一的溝通橋梁. 有時候也不禁感慨, 像我這種, 又能做業務, 做 Excel 表格, 同時又能兼數據開發的小哥哥難道不香嘛, 不搶手嘛...

數據工作: 文員用的 Excel 就相當於開發人員用 SQL. 都是必須會的.

因為我平時用的是數據庫是 Sybase IQ, 這種列式的, OLAP 型的. 特點就是, 高吞吐, 查詢極快. 正好適合我做數據報表這種的極速響應. 一般如果是 千萬級以下的數據呢, 我還是有些用 Mysql, 就是喜歡呀, 沒啥. 但千萬級以上的數據量, 你會發現 MysSql 的性能會 急劇下降. 就執行下 select count(*) from tb 就直接GG 了.

說個我真實的面試懟懟:

就一些公司老是喜歡問我 Mysql 怎查詢優化, 怎么大數據之類的話題, 我真的就懶得回答, 有一次就真的懟:

只有沒有錢的公司才老想着優化, 我們都是直接換更好的設備.

扯遠了, 回到 sumif 求和. 還是用 Mysql 來演示一把. SQL 大多數都差不多呢.

需求

對某個字段進行 條件求和, 即 Excel 的 sumif 功能

實現

用mysql 的 IF( ) 函數就能實現. 簡單以 score 表為例.

mysql> select * from cj.score;
+------+------+-------+
| s_id | c_id | score |
+------+------+-------+
| 0001 | 0001 |    80 |
| 0001 | 0002 |    90 |
| 0001 | 0003 |    99 |
| 0002 | 0002 |    60 |
| 0002 | 0003 |    80 |
| 0003 | 0001 |    80 |
| 0003 | 0002 |    80 |
| 0003 | 0003 |    80 |
+------+------+-------+
8 rows in set (0.00 sec)

需求是, 求出不同 s_id 在 課程id 為 "0001" 的 學生總分數. 當然可以只用 group by having 之類的 哈, 這里就為了舉個栗子. 理解意思即可.

select 
	a.s_id, 
	sum(if(a.c_id = '0001', score, 0)) as sum_0001
from cj.score as a 
group by a.s_id
+------+----------+
| s_id | sum_0001 |
+------+----------+
| 0001 |       80 |
| 0002 |        0 |
| 0003 |       80 |
+------+----------+
3 rows in set (0.00 sec)

當然, 在 IQ 其實是不支持這種 if( ) 語法的, 於是呢, 可以用 case when 來達到同樣的效果呢.

-- case when 
select 
	a.s_id, 
	sum(case when a.c_id = '0001'then score else 0 end) as sum_0001
from cj.score as a 
group by a.s_id
+------+----------+
| s_id | sum_0001 |
+------+----------+
| 0001 |       80 |
| 0002 |        0 |
| 0003 |       80 |
+------+----------+
3 rows in set (0.00 sec)

case when 果然是有點強大, 尤其是在我處理, 用戶的那些垃圾數據, 和行列轉換時經常要用的呢. 不扯了, 就簡單一個筆記而已.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM