2017-03-22 1 views
0

Ich bin sehr neu in SQL und ich habe mit einem ziemlich grundlegenden Problem gekämpft. Ich habe versucht, ein paar verschiedene Wege zu gehen, aber bisher hat noch nichts geklappt.PostgreSQL Mit mehreren Spalten, um Zahlen für einen Prozentsatz zu berechnen

Also in meiner Tabelle tourismdata habe ich 4 Spalten: transportType, Monat, Jahr und Anzahl. Beispiel:

Month Year Transport Type Count 
Nov 1992 Car    100 
Nov 1992 Plane   250 
Dec 1992 Car    200 
Dec 1992 Plane   250 
Jan 1993 Car    200 
Jan 1993 Plane   200 

Außer ich habe tatsächlich vier verschiedene Transportarten und viele weitere Monate und Jahre.

Ich möchte den prozentualen Anteil jedes Transports im Laufe der Jahre berechnen. So würde meine gewünschte Ausgabe etwas entlang der Linien der folgenden sein:

Year Transport Type Percentage 
1992 Car    37.5% 
1992 Plane   62.5% 
1993 Car    50% 
1993 Plane   50% 

Meine aktuellen Code sieht wie folgt aus:

WITH t1 as(
select transport, SUM(ncount) AS transportTotal 
from touristdata 
GROUP BY transport) 
SELECT years, touristdata.transport, ROUND(100.0 *(transportTotal/SUM(ncount))) 
FROM touristdata, t1 
GROUP BY years; 

In dieser Form erhalte ich die Fehlermeldung:

ERROR: column "touristdata.transport" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 5: SELECT years, touristdata.transport, ROUND(100.0 *(transpor... 

Aber ich wissen, dass das Hinzufügen von tourismdata.transport und transportTotal in die GROUP BY auch nicht funktioniert. Ich habe es versucht, um sicherzustellen, und ich endete mit 4 Einträge für jede Transportart pro Jahr.

Ich hatte nicht die letzte 'GROUP BY Jahre' vorher, und ich versuchte es mit Unterabfragen, aber ich konnte es nicht herausfinden.

Wenn mir jemand helfen könnte, würde ich es sehr zu schätzen wissen!

Antwort

0

Sie können dies mit Fensterfunktionen tun:

SELECT td.years, td.transport, SUM(ncount), 
     SUM(ncount)/SUM(1.0*SUM(ncount)) OVER (PARTITION BY year) as ratio 
FROM touristdata td 
GROUP BY td.years, td.transport; 
+0

Danke für die Hilfe, das ist für mich gearbeitet. –

Verwandte Themen