Использование подзапроса в IN codition в Oracle Pivot - PullRequest
0 голосов
/ 22 сентября 2019

Если я заранее не знаю, какие значения в названии столбца 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 (ВЫБЕРИТЕ ОТЛИЧИЕ C ОТ ДАННЫХ) ", появляется ошибка 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;

1 Ответ

1 голос
/ 22 сентября 2019

Вы ищете динамический PIVOT.Одним из способов является использование PIVOT XML :

Добавление ключевого слова XML к оператору PIVOT позволяет нам преобразовывать сгенерированные результаты сводки в формат XML. Это также делает PIVOT немного более гибким, что позволяет нам заменить жестко закодированное предложение IN подзапросом или любым символом подстановки.

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