我正在尝试在 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
使用过程动态返回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 中使用DBMS_SQL.return_result (l_cursor)
来避免带有REF CURSOR
参数的过程,这会直接为您提供查询结果。