網頁

2020/5/15

Oracle GROUP BY then SUM

今天工作碰到下面問題。

例如MY_LOG資料表有下面資料,裡面記錄每次客戶(CUST_ID)進行操作時的狀態(STATUS)。

+----+---------+--------+
| ID | CUST_ID | STATUS |
+----+---------+--------+
|  1 |       1 |      1 |
|  2 |       1 |      2 |
|  3 |       2 |      2 |
|  4 |       3 |      3 |
|  5 |       1 |      1 |
|  6 |       1 |      2 |
|  7 |       1 |      3 |
|  8 |       2 |      1 |
|  9 |       2 |      2 |
+----+---------+--------+

我想將以上資料依不同CUST_ID分類並總計所屬STATUS的數量如下。

+---------+----------+----------+----------+
| CUST_ID | STATUS_1 | STATUS_2 | STATUS_3 |
+---------+----------+----------+----------+
|       1 |        2 |        2 |        1 |
|       2 |        1 |        2 |        0 |
|       3 |        0 |        0 |        1 |
+---------+----------+----------+----------+ 

但試了FULL OUTER JOINUNION都無法達到想要的結果。最後把問題丟到stackoverflow上問,沒兩分鐘就有人回答,不虧是工程師的聖地。

SELECT
    CUST_ID,
    SUM(CASE WHEN STATUS = 1 THEN 1 ELSE 0 END) STATUS_1,
    SUM(CASE WHEN STATUS = 2 THEN 1 ELSE 0 END) STATUS_2,
    SUM(CASE WHEN STATUS = 3 THEN 1 ELSE 0 END) STATUS_3
FROM MY_LOG
GROUP BY
    CUST_ID

原來Aggregate Functions中還可以先用CASE WHEN ... THEN ... ELSE篩選後再處理。


沒有留言:

張貼留言