О сводном запросе SQL - PullRequest
       18

О сводном запросе SQL

0 голосов
/ 25 сентября 2018

Это статический сводный запрос:

SELECT  
    *
FROM
    (SELECT
         PI.PRODID||' '||' ('||PI.PRODNAME||' - '||PI.PACKSIZE||')' PNAME,I.SIA_ID, IP.SALES_QTY
     FROM 
         DIS_INVOICE_INFO I, DIS_INVOICE_PRODUCT IP, MKT_PROD_INFO PI
     WHERE
         I.SLNO = IP.SLNO
         AND PI.PRODID = IP.PRODID) s
PIVOT  
    (SUM(SALES_QTY) 
        FOR SIA_ID IN (10080, 10084, 10082)
    ) pvt

Но я хочу динамический запрос.

Как:

......
PIVOT 
    (SUM(SALES_QTY) 
         FOR SIA_ID IN (SELECT DISTINCT SIA_ID FROM DIS_INVOICE_INFO) 
    ) pvt

1 Ответ

0 голосов
/ 25 сентября 2018

enter image description here Вы не упомянули о своей DBMS, я не знаю для других DBMS систем, но для Oracle вы можете сделать ее динамичной, если вы производитеXML результат, как в следующем случае:

SELECT  
    *
FROM
    (SELECT PI.PRODID||' '||' ('||PI.PRODNAME||' - '||PI.PACKSIZE||')' PNAME,
            I.SIA_ID, IP.SALES_QTY
       FROM DIS_INVOICE_INFO I 
       INNER JOIN DIS_INVOICE_PRODUCT IP 
          ON (I.SLNO = IP.SLNO)
       INNER JOIN MKT_PROD_INFO PI
          ON (PI.PRODID = IP.PRODID)) s
PIVOT XML 
    (SUM(SALES_QTY) 
        FOR SIA_ID IN (SELECT DISTINCT SIA_ID FROM DIS_INVOICE_INFO)
    ) pvt;

Используя следующие операторы DDL;

create table DIS_INVOICE_INFO(SIA_ID int, SLNO int);
create table DIS_INVOICE_PRODUCT(PRODID int, SALES_QTY int, SLNO int);
create table MKT_PROD_INFO(PRODID int,PRODNAME varchar(90),PACKSIZE int);

insert all 
       into DIS_INVOICE_INFO values(10080,1);
       into DIS_INVOICE_PRODUCT values(1,100,1);
       into MKT_PROD_INFO values(1,'Milk',200);
select * from dual;

Вы получите следующие результаты для приведенного выше оператора SQL-Select:

   PNAME       SIA_ID_XML
  ------------ ---------- 
  (Milk - 200)   <CLOB>

где <CLOB> равно

<PivotSet><item><column name = "SIA_ID">10080</column>
<column name = "SUM(SALES_QTY)">100</column></item></PivotSet>

Ps Вы не можете использовать PIVOT динамически без опции XML, я имею в виду необходимость перечислить все аргументыявно в IN пункте, как в вашем случае.

...