Prozentanteile berechnen

Hallo,

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.


note | Anzahl | Prozent
1 | 5 | 19,2
2 | 10 | 38,5
3 | 1 | 3,8
4 | 3 | 11,5
5 | 4 | 15,4
6 | 3 | 11,5

gesamt | 26 | 100,0


Geht das überhaupt? Und wenn ja, wie?

Vielen Dank schonmal für eure Hilfe,
Jürgen

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.

Hallo,

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?

Wie lautet die Fehlermeldung genau?

Nachkommastellen: caste den Notenwert (INT) auf numeric oder float, und verwende to_char() zum formatieren.

Andreas

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.