Вы не упомянули о своей 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
пункте, как в вашем случае.