1.需求
現在需要統計每個id出現指定幾種scode的次數;
例:需要統計每個id出現12001,13001,15001出現的次數:
源數據表如下(table_01):
| id | scode |
|---|---|
| 001 | 12001 |
| 001 | 15001 |
| 002 | 13001 |
| 002 | 12001 |
| 001 | 12001 |
| 001 | 13001 |
| 002 | 13001 |
| 003 | 18001 |
需要產出的表如下(table_01):
| id | cnt_12001 | cnt_13001 | cnt_15001 |
|---|---|---|---|
| 001 | 2 | 0 | 1 |
| 002 | 1 | 2 | 1 |
2.實現方式
首先肯定會想到一種"原生態"的方式:
-
SELECT id -
,COUNT(1) cnt_12001 -
FROM table_01 -
WHERE scode = 12001 -
GROUP BY id;
先將每種scode的數據選出來,一個一個的統計次數,然后再把這幾種scode的統計結果按照id join起來,形成一張完整的表.這種方式適用需要統計的scode的種類少的情況,當scode種類有五六七八種的時候這種一個一個去join的方式會讓人抓狂的,所以就需要下面這種方式.
-
SELECT id -
,sum(CASE WHEN scode=12001 THEN 1 ELSE 0 END) cnt_12001 -
,sum(CASE WHEN scode=13001 THEN 1 ELSE 0 END) cnt_13001 -
,sum(CASE WHEN scode=15001 THEN 1 ELSE 0 END) cnt_15001 -
FROM table_01 -
WHERE scode IN (12001,13001,15001 ) -
GROUP BY id;
這種方式可以將條件下載sum里面,判斷好以后再加和,實現了帶條件count的功能.
得到table_2:
| id | cnt_12001 | cnt_13001 | cnt_15001 |
|---|---|---|---|
| 001 | 2 | 0 | 1 |
| 002 | 1 | 2 | 1 |
到這里又有人說了,這樣的話where條件里面是不是不用寫scode的條件了呢?
當where條件中不寫scode的條件時,這時id為003的這條信息才會出現
| id | cnt_12001 | cnt_13001 | cnt_15001 |
|---|---|---|---|
| 001 | 2 | 0 | 1 |
| 002 | 1 | 2 | 1 |
| 003 | 0 | 0 | 0 |
因為003沒有這幾種scode的數據,所以id003的統計結果全為0;
當然這里sum換成count也行,那么在count中需要填入什么條件呢?
我們評論見!