Ich habe eine SQL Server-Tabelle, die Benutzer und ihre Noten enthält. Nehmen wir der Einfachheit halber an, es gibt 2 Spalten - name
& grade
. Eine typische Zeile wäre also Name: "John Doe", Note: "A".
Ich suche nach einer SQL-Anweisung, die den Prozentsatz aller möglichen Antworten ermittelt. (A, B, C usw.) Gibt es auch eine Möglichkeit, dies zu tun, ohne alle möglichen Antworten zu definieren (offenes Textfeld - Benutzer können "Bestanden / Nicht Bestanden", "Keine" usw. eingeben).
Die endgültige Ausgabe, die ich suche, ist A: 5%, B: 15%, C: 40% usw.
sql
sql-server
tsql
Alex
quelle
quelle
Am effizientesten (mit over ()).
Universal (jede SQL-Version).
Mit CTE am wenigsten effizient.
quelle
cast((count(*) / (sum(count(*)) over() / 100)) AS DECIMAL(18, 2)) as Percentage
over()
funktioniert hervorragend auf Postgresql 10Anstatt einen separaten CTE zu verwenden, um die Gesamtsumme zu erhalten, können Sie eine Fensterfunktion ohne die Klausel "partition by" verwenden.
Wenn Sie verwenden:
Um die Anzahl für eine Gruppe zu ermitteln, können Sie Folgendes verwenden:
um die Gesamtzahl zu erhalten.
Beispielsweise:
Meiner Erfahrung nach ist es tendenziell schneller, aber ich denke, dass in einigen Fällen intern eine temporäre Tabelle verwendet wird (ich habe "Worktable" gesehen, wenn ich mit "set statistics io on" ausgeführt habe).
BEARBEITEN: Ich bin nicht sicher, ob meine Beispielabfrage das ist, wonach Sie suchen. Ich habe nur veranschaulicht, wie die Fensterfunktionen funktionieren.
quelle
tempdb
der sich die Arbeitstabelle befindet. Die logischen Lesevorgänge scheinen höher zu sein, aber sie werden anders als normal gezähltCOUNT(*) OVER ()
in Ihrer Abfrage eine völlig unabhängige Zahl zurückgeben (insbesondere die Anzahl der Zeilen der gruppierten Ergebnismenge). Sie solltenSUM(COUNT(*)) OVER ()
stattdessen verwenden.Sie müssen die Gesamtzahl der Noten berechnen. Wenn es sich um SQL 2005 handelt, können Sie CTE verwenden
quelle
Sie müssen sich im Notenfeld gruppieren. Diese Abfrage sollte Ihnen das geben, wonach Sie in so ziemlich jeder Datenbank suchen.
Sie sollten das von Ihnen verwendete System angeben.
quelle
Ich benutze dies einfach immer dann, wenn ich einen Prozentsatz berechnen muss.
Beachten Sie, dass 100.0 Dezimalstellen zurückgibt, während 100 allein das Ergebnis auf die nächste ganze Zahl aufrundet, selbst mit der Funktion ROUND ()!
quelle
Folgendes sollte funktionieren
BEARBEITEN: Verschob das
* 100
und fügte das hinzu,1.0
um sicherzustellen, dass keine Ganzzahldivision durchgeführt wirdquelle
Dies ist meines Erachtens eine allgemeine Lösung, obwohl ich sie mit IBM Informix Dynamic Server 11.50.FC3 getestet habe. Die folgende Abfrage:
gibt die folgende Ausgabe für die Testdaten aus, die unter der horizontalen Regel angezeigt werden. Die
ROUND
Funktion kann DBMS-spezifisch sein, der Rest (wahrscheinlich) nicht. (Beachten Sie, dass ich 100 in 100.0 geändert habe, um sicherzustellen, dass die Berechnung mit einer nicht ganzzahligen - DECIMAL, NUMERIC - Arithmetik erfolgt. Siehe die Kommentare und danke an Thunder.)quelle
quelle
In jeder SQL Server-Version können Sie eine Variable für die Summe aller Noten wie folgt verwenden:
quelle
Sie können eine Unterauswahl in Ihrer from-Abfrage verwenden (ungetestet und nicht sicher, welche schneller ist):
Oder
Oder
Sie können auch eine gespeicherte Prozedur verwenden (Entschuldigung für die Firebird-Syntax):
quelle
Ich hatte ein ähnliches Problem. Sie sollten in der Lage sein, das richtige Ergebnis mit 1,0 anstelle von 100 zu multiplizieren. Siehe Beispielbild im Anhang
Wählen Sie Note, (Anzahl (Note) * 1,0 / (Anzahl (*) aus MyTable auswählen)) als Punktzahl aus MyTable-Gruppe nach Note
quelle
Dieser funktioniert gut in MS SQL. Es transformiert varchar in das Ergebnis eines Floats mit zwei Dezimalstellen.
quelle