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