簡體   English   中英

帶有 IN CLAUSE 動態值的 SQL Pivot

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM