2017-11-09 3 views
0

12c에서 동적 PIVOT 쿼리를 가져 오려고하지만 올바른 솔루션을 찾기 위해 고심하고 있습니다. 이 경우 40-43 주 주가 기둥이되지만 달이 변경되면 주도 변경됩니다.동적 PIVOT with SQL

PIVOT XML은 데이터와 함께 작동하지만 분명히 XML 형식으로 허용되지 않으므로 대체 솔루션과 아이디어를 찾고 있습니까?

보고서는 동적으로 REF CURSOR를 반환 (여기 벗었) 기반 기간/주

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

사용 절차입니다

감사합니다. .

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 IS VARRAY (6) OF VARCHAR2 (200); PLS-00321 : 그냥 변수 선언하면 식 'A_COLLECTION는'입문 –

+0

의 좌측 부적절한이다 DECLARE v_in_variables VARCHAR2 (200); a_collection VARCHAR2 (200); 다음 오류가 발생합니다. PLS-00497 : INTO 목록의 단일 행과 다중 행 (BULK)을 혼합 할 수 없습니다. –

+0

누구든지이 작업을 지원할 수 있습니까? –