2016-05-22 10 views
0

Sah aus, fand aber nur nach unten gewählte Fragen ohne gute Antworten.Prozentsatz eines Vorkommens in einer Spalte

Ich versuche, den Prozentsatz eines Auftretens in SQL Server zu finden. Eine vereinfachte Version von dem, was ich tue:

ID NAME FAVORITE_COLOR 
------------------------------------ 
    1 Jim  Blue 
    2 Tom  Green 
    3 Rob  Yellow 
    4 Kev  Blue 
    5 Kim  Green 
    6 Bev  Blue 

kann ich zählen, wie viele von jedem, das ist einfach.

SELECT 
    favorite_color, COUNT(favorite_color) AS totals 
FROM 
    color_prefs 
GROUP BY 
    favorite_color 

Das wird mir sagen, 3 Personen mögen Blue (usw.). Was ich nicht herausfinden kann ist, wie viel Prozent ich bekomme. Ich möchte wissen, dass 50% der Leute Blau mögen. Ich habe versucht, die unten, aber SQL hasste es total:

SELECT 
    favorite_color, 
    COUNT(favorite_color)/SUM(COUNT(favorite_color)) AS color_percent 
FROM 
    color_prefs 
GROUP BY 
    favorite_color 

ich den Fehler:

Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

Natürlich, ich könnte PHP Figur dieses für mich machen, aber ich es muß einen Weg geben dies in SQL ohne Unterabfragen zu tun, oder?

+0

so wollen Sie eine Abfrage ohne Unterabfrage? – cableload

+0

Am Ende ist es mir egal, aber idealerweise ohne. Die echte Abfrage ist ein bisschen komplexer, weil ich zwei Tabellen zusammenschließe und auf einen Datumsbereich beschränke ... Aber das ist so spezifisch für mich, dass es niemals jemand anderem mit dem gleichen Problem helfen würde. – jonlink

Antwort

2

Sie es in zwei ways..first Weise tun können, ist nicht so effizient, aber wenn Sie Ihren Tisch, nicht viele Zeilen enthalten, dann sollte es in Ordnung sein ..

select favorite_color,count(favorite_color)*100/(select count(*) from a) 
from color_prefs 
group by favorite_color 

Dies ist der zweite Weg ist, und ist effizienter ..

select favorite_color,count(favorite_color)*100/sum(count(*)) over() 
from color_prefs 
group by favorite_color 

Kontrolle der sqlfiddle

+0

Geben Sie die Antwort auf diese Frage, weil es ein bisschen vollständiger ist. Es scheint so, als müsste ich etwas darüber lernen, um zu verstehen, wie das funktioniert. Vielen Dank! – jonlink

2

Verwenden Fensterfunktionen:

Select color, count(*), 
     Count(*) * 1.0/sum(count(*)) over() 
From color_prefs 
Group by color; 
+0

Das macht es. Aber warum/wie macht es das? Ich denke, was ich gerne wissen würde ist, wo ich suchen sollte, um mehr darüber herauszufinden, was ich falsch gemacht habe ODER was das hier richtig macht. Vielleicht mit over() anfangen? – jonlink

+0

Danke auch für die Hilfe! – jonlink

+1

Ein guter Anfang sind die Dokumentation oder Artikel zum Thema: http://sqlmag.com/sql-server-2012/how-use-microsoft-sql-server-2012s-window-functions-part-1. –

Verwandte Themen