oracle--聚合函數和case when結合使用


需求:

1 根據客戶信息表中信息比較出相應余額。

2 表中有客戶號,余額,各個時間點的分區信息,每個分區中客戶號唯一。

3 客戶信息中分區有10、11、12、13、14、15。

4 得到每個比上日余額信息,如下面表樣。

--創建測試表 客戶信息表
CREATE TABLE CUST_INFO_TEST(
CUST_NO VARCHAR2(5),
AUM_EDU NUMBER,
DT VARCHAR(10)
)

--在表中插入測試數據
SELECT * FROM CUST_INFO_TEST FOR UPDATE 

--測試數據如下
CUST_NO       AUM_EDU DT
---------- ---------- -----------
1                  11 20180610
2                  22 20180610
3                  33 20180610
1               11.11 20180611
2               22.22 20180611
3               33.33 20180611
1               11.21 20180612
2               22.32 20180612
3               33.33 20180612
1               11.44 20180613
2               22.44 20180613
3               33.44 20180613

--使用表的自關聯實現
SELECT A1.CUST_NO
      ,A3.AUM_EDU - A2.AUM_EDU AS BSR_11
      ,A4.AUM_EDU - A3.AUM_EDU AS BSR_12
      ,A1.AUM_EDU - A4.AUM_EDU AS BSR_13
  FROM CUST_INFO_TEST A1
LEFT JOIN CUST_INFO_TEST A2
  ON A1.CUST_NO = A2.CUST_NO 
 AND A2.DT = '20180610' 
 
LEFT JOIN CUST_INFO_TEST A3
  ON A1.CUST_NO = A3.CUST_NO 
 AND A3.DT = '20180611'
 
LEFT JOIN CUST_INFO_TEST A4
  ON A1.CUST_NO = A4.CUST_NO 
 AND A4.DT = '20180612'
 
WHERE A1.DT= '20180613';

--得到如下結果
CUST_NO      BSR_11     BSR_12     BSR_13
-------- ---------- ---------- ----------
1              0.11        0.1       0.23
2              0.22        0.1       0.12
3              0.33          0       0.11

--優化
SELECT 
       CUST_NO
      ,SUM(CASE WHEN DT='20180611' THEN AUM_EDU ELSE 0 END - CASE WHEN DT='20180610' THEN AUM_EDU ELSE 0 END) AS BSR_11
      ,SUM(CASE WHEN DT='20180612' THEN AUM_EDU ELSE 0 END - CASE WHEN DT='20180611' THEN AUM_EDU ELSE 0 END) AS BSR_12
      ,SUM(CASE WHEN DT='20180613' THEN AUM_EDU ELSE 0 END - CASE WHEN DT='20180612' THEN AUM_EDU ELSE 0 END) AS BSR_13
  FROM CUST_INFO_TEST
 WHERE DT IN ('20180610','20180611','20180612','20180613')
 GROUP BY CUST_NO 
 
--得到結果和上面一樣
CUST_NO      BSR_11     BSR_12     BSR_13
-------- ---------- ---------- ----------
1              0.11        0.1       0.23
2              0.22        0.1       0.12
3              0.33          0       0.11

 case when與聚合函數結合使用示例

CREATE TABLE TEST(
CUST_NO NUMBER,
ACT_TYPE VARCHAR2(50),
ACT_TIME DATE);

SELECT * FROM TEST FOR UPDATE; 

   CUST_NO ACT_TYPE    ACT_TIME
---------- ----------- -----------
         1 IN          2017/8/1
         1 MSG         2018/8/10
         2 MSG         2017/8/10
         3 IN          2018/8/23
         4 MSG         2018/8/17
         5 IN          2018/8/10
         5 MSG         2018/8/15
         5 MSG         2017/8/1
         5 IN          2018/8/6

SELECT CUST_NO
      ,SUM(CASE WHEN ACT_TYPE='IN' AND ACT_TIME>=DATE'2018-08-01' THEN 1 ELSE 0 END) AS IN_FLAG
      ,SUM(CASE WHEN ACT_TYPE='MSG' AND ACT_TIME>=DATE'2018-08-01' THEN 1 ELSE 0 END) AS MSG_FLAG
  FROM TEST
 GROUP BY CUST_NO 

--最后大於1就是對應的客戶標簽
   CUST_NO    IN_FLAG   MSG_FLAG
---------- ---------- ----------
         1          0          1
         2          0          0
         4          0          1
         5          2          1
         3          1          0

 


免責聲明!

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



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