2012-03-26 4 views
2

Ich möchte ein Ergebnis in folgendem Format eingestellt zurückzukehren:Oracle - zurückkehrende Summensumme sowie gelenkte Summensummen?

YEARMONTH Total ModelA ModelB ModelC 
200101 0  0  0  0 
200102 10 5  5  0 
200103 8  2  2  4 

wobei die Summe die Summe der Stunden für alle Modelltypen von yearmonth und die einzelnen Modellspalten sind die Summe der Stunden pro Modell sortiert ist Typ gruppiert nach Jahr Monat. Ich kann die richtigen Ergebnisse mithilfe der folgenden Abfrage mit verschachtelten wählt erhalten:

select distinct yearmonth, 
    sum(a.hours) as Total, 
    (select sum(b.hours) from model_hours b 
     where model = 'ModelA' and a.yearmonth = b.yearmonth) as ModelA, 
    (select sum(b.hours) from model_hours b 
     where model = 'ModelB' and a.yearmonth = b.yearmonth) as ModelB, 
    (select sum(b.hours) from model_hours b 
     where model = 'ModelC' and a.yearmonth = b.yearmonth) as ModelC 
from model_hours a 
group by yearmonth 
order by yearmonth 

ich neugierig war 11 unter Verwendung der Pivot-Funktion in Oracle versuchen, die gleichen Ergebnisse zu erzielen, und bin in der Lage, alle Ergebnisse mit Ausnahme der insgesamt zu erhalten Stunden die folgende Abfrage verwenden:

select * from (
    select yearmonth, hours, model 
    from model_hours a 
) 
pivot 
( 
    sum(hours) 
    for model in ('ModelA', 'ModelB', 'ModelC') 
) 
order by yearmonth 

, die dieses Ergebnis zurückgibt:

YEARMONTH ModelA ModelB ModelC 
200101  0  0  0 
200102  5  5  0 
200103  2  2  4 

ich habe nicht in der Lage gewesen, um herauszufinden, wie auch die Summe der Stunden für alle Modelle zu erhalten, g rouped by yearmonth, in dieser Ergebnismenge. Ist es möglich? Und wenn ja, wäre es wahrscheinlich effizienter als die verschachtelten Selects? Diese bestimmte Tabelle hat gerade einige 200K Zeilen.

Antwort

4

Von forums.oracle.com gibt es mehrere ähnliche Möglichkeiten, es zu tun ... die einfachste Syntax zu sein scheint:

select yearmonth,ModelA + ModelB + ModelC Total,ModelA,ModelB,ModelC from (
    select yearmonth, hours, model 
    from model_hours a 
) 
pivot 
( 
    sum(hours) 
    for model in ('ModelA' as ModelA, 'ModelB' as ModelB, 'ModelC' as ModelC) 
) 
order by yearmonth 

Als beiseite, sind die Schwenk Abfragen etwa 100-mal schneller als die ursprüngliche Abfrage mit skalaren Unterabfragen!

Verwandte Themen