动态PIVOT与SQL

时间:2017-11-09 12:29:22

标签: sql oracle pivot

我正在尝试在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

1 个答案:

答案 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)参数的过程,这会直接为您提供查询结果。