2017-11-09 22 views
0

私は12cで動的PIVOTクエリを取得しようとしていますが、正しい解決策を見つけるのに苦労しています。この場合、40〜43週は列になりますが、月が変わると週も変わります。動的PIVOT with SQL

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

は、動的に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 

これは、PL/SQLブロック内ではなく、sqlplus/sqldeveloperプロンプトで機能します。

Oracle 12cを使用している場合は、REF CURSOR引数を使用して、PL/SQL内でDBMS_SQL.return_result (l_cursor)を使用すると、問合せ結果を直接得ることができます。

+0

ポストに感謝します。私はアレイを使用したことがないので、いくつかのフォローアップや問題があります。 PLS-00201:識別子 'A_COLLECTION'を宣言する必要があります これで配列を宣言しましたが、 DECLARE v_in_variables VARCHAR2(200); タイプa_collectionは、VARCHAR2(200)のVARRAY(6)です。 PLS-00321:私はちょうど変数宣言した場合、発現 'A_COLLECTION' は代入文 –

+0

の左側として不適切である: DECLARE v_in_variables VARCHAR2(200)。 a_collection VARCHAR2(200); PLS-00497:INTOリストの1行と複数行(BULK)を混在させることはできません –

+0

誰でもこれを支援できますか? –