2016-06-23 1 views
2
als Werte (Zeilen) in der zweiten Tabelle gespeichert sind

Tabelle ASQL von Oracle - Summenwerte in den Spalten in der ersten Tabellenspalte Namen, die

Store_Num BKT1 BKT2 BKT3 BKT4 BKT5 BKT6 BKT7 BKT8 BKT9 
111   1  2  1  0  3  2  4  2  5 

Tabelle B

Monthly_Bucket Weekly_Buckets         
MBKT1   BKT3,BKT4,BKT5,BKT6         
MBKT2   BKT7,BKT8,BKT9,BKT10          

Abfrage in Tabelle aussehen sollte B.Monthly_Bucket Spalten entsprechende Werte in Weekly_Buckets Spalte. Dann nehmen Sie die Werte aus der Spalte Weekly_Buckets als Spaltennamen, um entsprechende Werte in Tabelle A auszuwählen und zu addieren.
Beispiel: In Tabelle B Monthly_Bucket nehmen wir den Wert MBKT1, jetzt sehen wir, dass der entsprechende Wert von MBKT1 in der Spalte Weekly_Buckets BKT3, BKT4, BKT5 ist. BKT6.
Also nehmen wir diesen Wert BKT3, BKT4, BKT5, BKT6 und behandeln jeden Wert BKT3 und BKT4 und BKT5 und BKT6 einzeln als Spaltennamen, um Daten auszuwählen und diese 4 Spalten in eine Spalte von Tabelle A zu summieren. Das Ergebnis sollte aussehen unter

Ergebnis Tabelle

Store_Num MBKT1         
111   6 (we got this by summing columns BKT3,BKT4,BKT5,BKT6)   
+0

Siehe Normalisierung – Strawberry

Antwort

0

Sie den like Operator verwenden können und die Aufspaltung der weekly_buckets Saiten vermeiden in Komponenten, etwa so:

with table_a (store_num, BKT1, BKT2, BKT3, BKT4, BKT5, BKT6, BKT7, BKT8, BKT9) as (
     select 111, 1, 2, 1, 0, 3, 2, 4, 2, 5 from dual 
    ), 
    table_b (monthly_bucket, weekly_buckets) as (
     select 'MBKT1', 'BKT3,BKT4,BKT5,BKT6' from dual union all 
     select 'MBKT2', 'BKT7,BKT8,BKT9,BKT10' from dual 
    ), 
    table_a_unpivot (store_num, weekly_bucket, weekly_value) as (
     select * from table_a 
     unpivot (
     weekly_value for 
       weekly_bucket in (BKT1, BKT2, BKT3, BKT4, BKT5, BKT6, BKT7, BKT8, BKT9) 
     ) 
    ) 
select a.store_num, monthly_bucket, sum(weekly_value) as monthly_value 
from table_a_unpivot a 
join table_b   b 
     on b.weekly_buckets || ',' like '%' || a.weekly_bucket || ',%' 
group by store_num, monthly_bucket; 

Ergebnis:

STORE_NUM MONTHLY_BUCKET MONTHLY_VALUE 
---------- -------------- ------------- 
     111 MBKT1      6 
     111 MBKT2      11 

2 rows selected. 

Beachten Sie das "Komma beenden" in der Join-Bedingung (vorletzte Codezeile); Ohne diesen hässlichen Trick passt BKT1 BKT10 in die MBKT2-Aggregat-Zeichenfolge, entgegen Ihrer Anforderung.

Edit:

Um in Spalten monatlichen Bucketwerte aufgereiht zu erhalten, können Sie den pivot Betrieb verwenden (vorausgesetzt, Sie vorher die Namen der möglichen Eimer weiß), etwa so:

with table_a (store_num, BKT1, BKT2, BKT3, BKT4, BKT5, BKT6, BKT7, BKT8, BKT9) as (
     select 111, 1, 2, 1, 0, 3, 2, 4, 2, 5 from dual 
    ), 
    table_b (monthly_bucket, weekly_buckets) as (
     select 'MBKT1', 'BKT3,BKT4,BKT5,BKT6' from dual union all 
     select 'MBKT2', 'BKT7,BKT8,BKT9,BKT10' from dual 
    ), 
    table_a_unpivot (store_num, weekly_bucket, weekly_value) as (
     select * from table_a 
     unpivot (
     weekly_value for 
       weekly_bucket in (BKT1, BKT2, BKT3, BKT4, BKT5, BKT6, BKT7, BKT8, BKT9) 
     ) 
    ), 
    m (store_num, monthly_bucket, weekly_value) as (
     select a.store_num, b.monthly_bucket, a.weekly_value 
     from table_a_unpivot a 
     join table_b   b 
       on b.weekly_buckets || ',' like '%' || a.weekly_bucket || ',%' 
    ) 
select * from m 
pivot (sum(weekly_value) for monthly_bucket in ('MBKT1' as MBKT1, 'MBKT2' as MBKT2)); 

Ergebnis:

STORE_NUM  MBKT1  MBKT2 
---------- ---------- ---------- 
     111   6   11 
+0

Hey, das funktioniert gut, aber das letzte, was ich brauche, ist Daten in folgendem Format: STORE_NUM MBKT1 MBKT2 111 6 11 –

+0

Jeder besondere Grund, Sie nicht gesagt haben, wenn Sie gefragt die Frage zunächst? – mathguy

+0

Entschuldigung für Missverständnisse, die durch meine Frage zunächst verursacht haben könnte. Aber ich denke, ich hatte in meiner Frage unter "Ergebnistabelle" das Format, das ich suche. –

0

Es scheint, dass ein desing Ihrer Datenstrukturen eine Normalisierung benötigt.

Sie können eine Abfrage wie diese versuchen, aber es wird wahrscheinlich sehr ineffizient sein, müssen Sie Daten normalisieren bessere Ergebnisse zu erzielen:

SELECT store_num, monthly_bucket, sum(some_value) 
FROM (
    SELECT * 
    from TABLEA 
    UNPIVOT (
     some_value FOR col_name IN (BKT1, BKT2, BKT3, BKT4, BKT5, BKT6, BKT7, BKT8, BKT9) 
    ) 
) a 
JOIN (
    select monthly_bucket, trim(column_value) Weekly_Buckets 
    from tableb, xmltable(('"' || replace(Weekly_Buckets, ',', '","') || '"')) 
) b 
ON b.Weekly_Buckets = a.col_name 
GROUP BY store_num, monthly_bucket 

STORE_NUM MONTH       SUM(SOME_VALUE) 
---------- ----- --------------------------------------- 
     111 MBKT1          6 
     111 MBKT2          11 
+0

ich versuche, eine der Auswahlabfrage von Ihrem soluti zu laufen oben, aber Fehler erhalten: ORA-02000: fehlendes Schlüsselwort COLUMNS:: monate_bucket, trim (column_value) Weekly_Buckets aus tableb, xmltable (('' '|| ersetzen (Weekly_Buckets, ',', '","') || " –

+0

Vielen Dank. Schätzen Sie Ihre Hilfe! –

Verwandte Themen