2016-08-11 7 views
0

Ich habe eine Tabelle wie unten gezeigt. Ich möchte abfragen und zeigen Zeilendaten als SpaltenSQL: Pivot Möglichkeit, Daten abzufragen

Customer MetricName MetricValue Date 
A   Upload 2   10-AUG-2007 
A   Download 2   10-AUG-2007 
A   Storage 100  10-AUG-2007 
A   Storage 110  11-AUG-2007 
B   Storage 200  11-AUG-2007 
A   Upload 2   12-AUG-2007 
A   Download 2   12-AUG-2007 
B   Upload 2   10-AUG-2007 
B   Download 2   10-AUG-2007 

Nutzungs Letzte Woche

Herunterladen - Summe aller Downloads in einer Woche Lagerung - Höchster Wert in der Woche

Customer Download Upload Storage 
    A   4  4  110 
    B   2  2  200 

Wie erreichen Sie dies mit Pivot oder andere Methode

+2

Was haben Sie versucht? Sie können einen allgemeinen Tabellenausdruck (oder geschachtelte Auswahl) verwenden, um die Zeilen zu filtern, die Sie dann verwenden möchten. PIVOT – Matt

+0

Sind es nur diese 3 Optionen - 'Download',' Upload' oder 'Storage'? - Wenn ja, wäre es besser, wenn Sie SQL einfach direkt schreiben. –

+0

Wenn ich Pivot verwende, wie mache ich 2 Klauseln - MAX und SUM in derselben Spalte ...? – user3359574

Antwort

0

So etwas wie ... PIVOT erfordert die gleiche Aggregatfunktion, die alle auf col angewendet werden umns; Die alte "manuelle" Art des Pivotierens mit Hilfe von Case-Ausdrücken ist flexibler (wie unten gezeigt). Ich war mir nicht sicher, was du mit "Woche" meintest - ich habe das nur in eine WHERE Klausel geschrieben. Verwenden Sie auch keine reservierten Wörter wie DATE für Spalten- oder Tabellennamen, Sie können dies nicht direkt tun und Sie sollten es nicht auf die einzig mögliche Weise tun (doppelte Anführungszeichen) - es ist eine sehr schlechte Übung. Ich habe den Spaltennamen Date in dt geändert.

with 
    input_data (customer, metricname, metricvalue, dt) AS (
     select 'A', 'Upload' , 2 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Download', 2 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Storage' , 100 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Storage' , 110 , to_date('11-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'B', 'Storage' , 200 , to_date('11-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Upload' , 2 , to_date('12-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Download', 2 , to_date('12-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'B', 'Upload' , 2 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'B', 'Download', 2 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual 
    ) 
select customer, 
     sum(case when metricname = 'Upload' then metricvalue end) as upload, 
     sum(case when metricname = 'Download' then metricvalue end) as download, 
     max(case when metricname = 'Storage' then metricvalue end) as storage 
from  input_data 
where dt between to_date('09-AUG-2007', 'dd-MON-yyyy') and 
               to_date('15-AUG-2007', 'dd-MON-yyyy') 
group by customer 
order by customer 
; 

CUSTOMER  UPLOAD DOWNLOAD STORAGE 
-------- ---------- ---------- ---------- 
A     4   4  110 
B     2   2  200 
+0

Das war, was ich gesucht habe. Danke Kumpel !!! – user3359574