簡體   English   中英

在 Oracle Pivot 的 IN 編碼處使用子查詢

[英]Using subquery at IN codition in Oracle Pivot

如果我事先不知道列名 C0 的值是什么,如何修改我的 IN 條件?

如果我使用“IN ('a' AS A, 'b' AS B)”,它的工作原理如下。

ROWNUM   M  A  B
------  -- -- --
1     a__  3.5 35
2     abd  1.5 15
3     abe  3.5 35
4     ace  5.5 55

但是,如果我使用子查詢“IN (SELECT DISTINCT C FROM DATAA)”,則會顯示 ORA-00936 錯誤。

我的代碼如下;

--Table and data
    CREATE TABLE T4 (
    C0 VARCHAR2(10),
    C1 VARCHAR2(10),
    C2 NUMBER
    );
    INSERT INTO T4  VALUES ('a','abd',1);
    INSERT INTO T4  VALUES ('a','abd',2);
    INSERT INTO T4  VALUES ('a','abe',3);
    INSERT INTO T4  VALUES ('a','abe',4);
    INSERT INTO T4  VALUES ('a','ace',5);
    INSERT INTO T4  VALUES ('a','ace',6);

    INSERT INTO T4  VALUES ('b','abd',10);
    INSERT INTO T4  VALUES ('b','abd',20);
    INSERT INTO T4  VALUES ('b','abe',30);
    INSERT INTO T4  VALUES ('b','abe',40);
    INSERT INTO T4  VALUES ('b','ace',50);
    INSERT INTO T4  VALUES ('b','ace',60);  


--Code
        WITH DATAA AS (
        SELECT ROWNUM,rr.C0,rr.M, rr.ss
        FROM
        (
        SELECT C0,C1 M, AVG(C2) ss FROM T4  GROUP BY C0, C1
        UNION
        SELECT C0,SUBSTR(C1,1,1)||'__'  ,AVG(C2) ss FROM T4  GROUP BY C0,SUBSTR(C1,1,1) ) rr
        )
        -- USING PIVOT
        SELECT
            ROWNUM,
            TAB.*
        FROM
            (
                SELECT
                    *
                FROM
                    (
                        SELECT
                            M,
                            C0,
                            SS
                        FROM
                            DATAA
                    ) PIVOT (
                        SUM ( SS )
                        FOR ( C0 )              
                        IN ( 'a' AS A, 'b' AS B )   -- This condition works correctly, as expected
           --IN ( SELECT DISTINCT C FROM DATAA)  -- But,this subquery does not work. ORA-00936 error shows.
                    )
                ORDER BY
                    1
            ) TAB;

您正在搜索動態 PIVOT。 一種方法是使用PIVOT XML

將 XML 關鍵字添加到 PIVOT 運算符允許我們將生成的 pivot 結果轉換為 Z3501BB093D3693810B8CF71053 格式。 它還使 PIVOT 更加靈活,允許我們用子查詢或 ANY 通配符替換硬編碼的 IN 子句。

SELECT *
FROM (SELECT M, C0, SS FROM DATAA) 
PIVOT XML (SUM(SS) FOR (C0) IN (SELECT DISTINCT C FROM DATAA))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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