2016-03-31 4 views
1

Ich habe eine Tabelle namens spending (eigentlich in BigQuery, obwohl ich glaube, dass das nicht unbedingt relevant für diese Frage ist), die etwa 2,9 GB und 19 Millionen Zeilen ist.Wie führe ich eine Unterabfrage durch, um eine Tabelle in zwei Gruppen aufzuteilen?

Die Datenstruktur ist wie folgt:

product,org,spend,to_include,proportion_overseas 
---------------------------------- 
SK001,03V,"Yes",0.1 
SK002,03V,2.4,"Yes",0.1 
SK001,O3T,66.1,"No",0.47 
SK002,03T,87.1,"No",0.47 
SK001,04C,16.1,"Yes",0 
SK002,04C,27.1,"Yes",0 
... 

Für Informationen, es leicht denormalised ist, dass to_include und proportion_overseas sind tatsächlich Eigenschaften jeder Organisation.

Jetzt möchte ich zur Arbeit, für jedes Produkt:

  • die Gesamtmenge, dass alle Organisationen ohne Übersee-Ausgaben für das Produkt ausgegeben, und
  • die Gesamtmenge, dass alle Organisationen mit Nicht-Null Auslandsausgaben für dieses Produkt ausgegeben.

Ich möchte auch nur in dieser Berechnung nur Zeilen enthalten, wo to_include='Yes'.

Ich bin mir nicht sicher, was der beste Ansatz ist, dies in SQL zu tun. Es macht mir nichts aus, ob ich am Ende mit zwei oder einem Tisch komme.

Ich weiß, wie alle Ausgaben von Code zu bekommen, für alle relevanten Zeilen:

SELECT product, SUM(spend) 
FROM spending 
WHERE to_include='Yes' 
GROUP BY product; 

Aber was ich nicht weiß, ist, wie jede Zeile in zwei Gruppen aufgeteilt: eine Gruppe, in der proportion_overseas=0 und eine Gruppe wo proportion_overseas>0.

Ich glaube nicht, 'Unterabfrage' ist der richtige Begriff, also weiß ich nicht wirklich, wofür Google!

Antwort

0

können Sie bedingte Aggregation verwenden:

SELECT product, SUM(spend), 
     SUM(CASE WHEN proportion_overseas = 0 THEN spend ELSE 0 END) as not_overseas, 
     SUM(CASE WHEN proportion_overseas > 0 THEN spend ELSE 0 END) as overseas 
FROM spending 
WHERE to_include='Yes' 
GROUP BY product; 
+0

Brilliant, danke! – Richard