2016-04-09 33 views
-1

'da dinamik sütun değerleri oluşturma Verilerimdeki sütunlardan birinden dinamik olarak sütunlar oluşturmak istiyorum. Aşağıdaki durumumda, verilerimi run_date ile gruplandırmam ve her bir marketplace_code öğesinin bir sütun adı olması gerekiyor. şuna benzer bir şey halineOracle 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 

:

Böylece temelde bu verileri dönüştürmek için gereken

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

Ben pivotu kullanarak denedim ama bu olayı çözmek için nasıl emin değilim. Ayrıca, marketplace kodunun sayısının sabit olmadığını ve artabileceğini düşünmemiz gerekiyor. Şimdiden teşekkürler. Statik pivot

+0

Google'ı: "Oracle dinamik pivotu" –

cevap

0

SQL değerleri: Dinamik pivot

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 değerleri:

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;