[英]SQL Pivot with dynamic values for IN CLAUSE
我有以下格式的表格
細節
+-------------------+--------+------------+----------------+-------+
| LOB | Level | Year_Month | Classification | Count |
+-------------------+--------+------------+----------------+-------+
| Mergers& Acqu | Level3 | 2020-05 | Statement | 356 |
+-------------------+--------+------------+----------------+-------+
| Wealth Management | Level2 | 2020-05 | Lending | 23 |
+-------------------+--------+------------+----------------+-------+
| Finance | Level3 | 2020-06 | Statement | 65 |
+-------------------+--------+------------+----------------+-------+
如何旋轉具有計數的 Year_month 列?
預期結果
+-------------------+--------+----------------+---------+---------+
| LOB | Level | Classification | 2020-05 | 2020-06 |
+-------------------+--------+----------------+---------+---------+
| Mergers& Acqu | Level3 | Statement | 356 | 0 |
+-------------------+--------+----------------+---------+---------+
| Wealth Management | Level2 | Lending | 23 | 0 |
+-------------------+--------+----------------+---------+---------+
| Finance | Level3 | Statement | 0 | 65 |
+-------------------+--------+----------------+---------+---------+
我嘗試了下面的查詢,但沒有得到想要的結果
SELECT * FROM DETAILS
PIVOT (SUM(Count) FOR YEAR_MONTH IN (SELECT distinct YEAR_MONTH FROM DETAILS))
如何使 IN CLAUSE 具有動態值而不是預設值?
使用替代變量的選項:
SQL> set verify off
SQL> clear columns
columns cleared
SQL> column llist new_value slist
SQL> select listagg(ym, ', ') within group (order by ym) as llist
2 from (select distinct
3 chr(39) || year_month ||chr(39) || ' as "' || year_month ||'"' ym
4 from details
5 );
LLIST
--------------------------------------------------------------------------------
'2020-05' as "2020-05", '2020-06' as "2020-06"
SQL> select * from
2 (select lob, clevel, classification, year_month, ccount from details)
3 pivot (sum(ccount)
4 for year_month in (&slist));
LOB CLEVEL CLASSIFIC 2020-05 2020-06
----------------- ------ --------- ---------- ----------
Finance level3 statement 65
Wealth Management level2 lending 23
Mergers and Acqu level3 statement 356
SQL>
它的缺點是,如果LISTAGG
的結果超過 4000 個字符,它就會失敗(但是,再說一次,您將如何處理包含超過 500 個月的結果?)。
除非您使用PIVOT XML
否則 Oracle 不支持PIVOT
函數的IN
子句中的動態值。 運行查詢時,Oracle 需要它始終具有相同數量的列。
如果您要使用PIVOT XML
這里是您的查詢示例
WITH
details (lob_val,
level_val,
year_month,
classification,
COUNT)
AS
(SELECT 'Mergers& Acqu', 'Level3', '2020-05', 'Statement', 356 FROM DUAL
UNION ALL
SELECT 'Wealth Management', 'Level2', '2020-05', 'Lending ', 23 FROM DUAL
UNION ALL
SELECT 'Finance', 'Level3', '2020-06', 'Statement', 65 FROM DUAL)
SELECT *
FROM (SELECT lob_val, level_val, year_month, classification, COUNT FROM details)
PIVOT XML (SUM (COUNT) AS sum_count
FOR (year_month)
IN (SELECT DISTINCT year_month
FROM details));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.