2016-04-09 3 views
-1

データに存在する列の1つから列を動的に作成したいとします。私の場合、私はrun_dateで私のデータをグループ化し、各marketplace_codeを列名として持つ必要があります。Oracle SQLでの動的列値の生成

だから基本的に私は、このデータを変換する必要があります。このようなものに

run_date, marketplace_code, count 
06-APR-16, US,     1125197  
06-APR-16, MX,     26873 
06-APR-16, IT,     5197   
06-APR-16, UK,     23873 
05-APR-16, US,     486889 
05-APR-16, MX,     486819 
05-APR-16, IT,     536889 
05-APR-16, UK,     986819 

run_date, US,   MX,  IT,  UK 
06-APR-16, 1125197, 26873, 5197, 23873 
05-APR-16, 486889,  486819, 536889, 986819 

私はピボットを使用してみましたが、私はこの1つを解決する方法がわからないです。また、marketplace_codeの数が固定されておらず、増加する可能性があることを考慮する必要があります。前もって感謝します。静的ピボットため

+0

グーグル: "Oracleの動的なピボット" –

答えて

0

SQLは値:ダイナミックピボットため

SELECT run_date, 
     MAX(CASE marketplace_code WHEN 'US' THEN "count" END) AS US, 
     MAX(CASE marketplace_code WHEN 'MX' THEN "count" END) AS MX, 
     MAX(CASE marketplace_code WHEN 'IT' THEN "count" END) AS IT, 
     MAX(CASE marketplace_code WHEN 'UK' THEN "count" END) AS UK 
FROM you_table 
GROUP BY run_date; 

PL/SQLは値:

VARIABLE cur REFCURSOR; 

DECLARE 
    TYPE string_table IS TABLE OF VARCHAR2(4000); 
    t_codes string_table; 
    p_sql  CLOB; 
BEGIN 
    SELECT DISTINCT marketplace_code 
    BULK COLLECT INTO t_services, t_counts 
    FROM your_table; 

    p_sql := EMPTY_CLOB() || 'SELECT run_date'; 
    FOR i IN 2 .. t_codes.COUNT LOOP 
    p_sql := p_sql || ', MAX(CASE marketplace_code WHEN ''' 
        || t_codes(i) 
        || ''' THEN "count" END) AS "' 
        || t_codes(i) 
        || '"'; 
    END LOOP; 
    p_sql := p_sql || ' FROM your_table GROUP BY run_date'; 

    OPEN :cur FOR p_sql; 
END; 
/

PRINT cur; 
関連する問題