首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle SQL 行列轉換:按月統計不同類型用戶註冊數

     編輯:程式設計綜合問答

需求

激活表 TL_CSU_ACTIVATE_LOG、用戶表 TV_CSU_USER,查詢 2014-12 至 2015-12 每月 T/B/M/D 四類用戶註冊數,輸出橫表。

解決方案:CASE WHEN + GROUP BY

SELECT TT.Month,
       SUM(CASE WHEN TT.TYPE = 'B' THEN Count ELSE 0 END) AS B,
       SUM(CASE WHEN TT.TYPE = 'M' THEN Count ELSE 0 END) AS M,
       SUM(CASE WHEN TT.TYPE = 'D' THEN Count ELSE 0 END) AS D,
       SUM(CASE WHEN TT.TYPE = 'T' THEN Count ELSE 0 END) AS T
FROM (
    SELECT TO_CHAR(T1.ACTIVATE_TIME, 'yyyy-MM') AS Month,
           T2.TYPE,
           COUNT(*) AS Count
    FROM TL_CSU_ACTIVATE_LOG T1
    LEFT JOIN TV_CSU_USER T2 ON T2.USER_ID = T1.USER_ID
    WHERE TO_CHAR(T1.ACTIVATE_TIME, 'yyyy-MM') BETWEEN '2014-12' AND '2015-12'
    GROUP BY T2.TYPE, TO_CHAR(T1.ACTIVATE_TIME, 'yyyy-MM')
) TT
GROUP BY TT.Month
ORDER BY TT.Month;

關鍵點

  • 內層按 月份+類型 分組計數,外層按月份彙總並用 CASE WHEN 將行轉列。
  • 類型固定(T/B/M/D)時直接硬編碼;若類型動態,需用動態 SQL 或 PIVOT(Oracle 11g+)。
  • TO_CHAR 格式化月份便於分組與排序。

激活表結構 用戶表結構 期望輸出

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved