我正在尝试在12c工作中获得动态PIVOT查询,但我正在努力寻找正确的解决方案。在这种情况下,周40-43将是列,但随着月份的变化,周数也会变化。
PIVOT XML与数据一起工作,但显然是XML格式,不可接受,所以我正在寻找一些替代解决方案和想法????
谢谢,
该报告基于期间/周(在此处删除)
SELECT STORE, NET_SALES, WEEK
FROM Table A
PIVOT
(
SUM(NET_SALES)
FOR WEEK IN (40,41,42,43)
)
ORDER BY STORE;
Subquery for IN Clause…
SELECT DISTINCT(CT.WK_OF_YEAR)
FROM CALENDAR CT
WHERE CT.PERIOD_NO = '10'
and CT.THEYEAR = '2017'
ORDER BY CT.WK_OF_YEAR
答案 0 :(得分:0)
使用过程动态返回REF CURSOR
。 。
CREATE OR REPLACE PROCEDURE pr_getdyn_sale
( p_cur OUT SYS_REFCURSOR )
IS
v_in_variables VARCHAR2(200);
BEGIN
SELECT DISTINCT
LISTAGG(wk_of_year, ',') WITHIN GROUP( ORDER BY wk_of_year )
INTO v_in_variables
FROM
( SELECT DISTINCT
( ct.wk_of_year )
FROM
calendar ct
WHERE ct.period_no = '10'
AND ct.theyear = '2017'
);
OPEN p_cur FOR 'SELECT *
FROM TableA
PIVOT
(
SUM(NET_SALES)
FOR WEEK IN (' ||
v_in_variables ||
')
)
ORDER BY STORE';
END;
/
您现在可以执行此过程并使用此调用获取结果。
variable x refcursor
exec pr_getdyn_sale( :x )
print x
这适用于sqlplus / sqldeveloper提示符,而不是PL / SQL块。
如果您使用的是Oracle 12c,则可以通过在PL / SQL中使用REF CURSOR
来避免使用DBMS_SQL.return_result (l_cursor)
参数的过程,这会直接为您提供查询结果。