ich habe folgendes (für euch sicher simples) Problem.
Ich habe eine Datenbank in der Schulnoten enthalten sind.
Ich möchte nun wissen, wie oft jede Note vorkommt und zugleich wie groß der Prozentanteil dieser Note ist. Zusätzlich sollten die Prozentwerte auf eine Nachkommastelle gerundet werden und genial wäre es, wenn die letzte Zeile (gesamt |26 | 100,0) auch irgendwie zu programmieren ist
Also so sollte es dann aussehen.
Du hast leider vergessen, die Struktur Deiner Tabelle zu posten, deswegen mal ein Schuss in’s Blaue
select note::text,
anzahl,
round( (anzahl_note::numeric / alle_noten::numeric) * 100, 2) as prozent
from (
select distinct on (note) note,
count(*) over (partition by note) as anzahl,
count(*) over (partition by null) alle_noten
from bewertung
) t
union all
select 'Gesamt', count(*), 100.0
from bewertung
Da Du keine Version angegeben hast, gehe ich davon aus, dass Du die aktuelle PostgreSQL Version (8.4) verwendest.
ja, ich hab die aktuelle PostgreSQL Version (8.4) drauf.
Wenn ich es so mache, wie beschrieben, dann kommt immer eine Fehlermeldung wegen “over”.
Jetzt hab ich es mal anders geschrieben, nämilch so:
SELECT DISTINCT (note) AS Note,
COUNT(note) AS Anzahl,
COUNT(note) * 100 / (SELECT COUNT(note) FROM db)
AS Prozent
FROM db
GROUP BY note
ORDER BY note
Das funktioniert auch soweit, nur werden die Prozentangaben auf ganze Zahlen gerunden bzw. abgeschnitten. Wie kann ich da noch den Befehl bringen, dass die Prozentzahlen auf 2 Nachkommastellen gerundet werden?
Entweder hast Du mein Beispiel falsch abgetippt oder Du hast kein 8.4
SELECT DISTINCT (note) AS Note,
COUNT(note) AS Anzahl,
COUNT(note) * 100 / (SELECT COUNT(note) FROM db)
AS Prozent
FROM db
GROUP BY note
ORDER BY note
Das könnte um einiges langsamer sein als meine Lösung. Ich bin nicht ganz sicher, ob das "(SELECT COUNT(note) FROM db) " nicht für jede Zeile einmal aufgerufen wird, oder ob Postgres so schlau ist, dass nur einmal zu machen.