Dynamic PIVOT with SQL



我正在尝试在 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参数的过程,这会直接为您提供查询结果。

相关内容

  • 没有找到相关文章

最新更新