2016-08-01 11 views
0

Ich habe die folgende Abfrage:Gruppierung scheint nicht zu arbeiten, wie ich (SQL Server) erwartet

SELECT 
    AVG(CAST(RATING AS NUMERIC(18, 2))) AS AVERAGE, 
    QUESTIONID, 
    COUNT(QUESTIONID) AS COUNT 
FROM 
    AnswersRating 
WHERE 
    SURVEYID IN (SELECT ID 
       FROM SURVEYS 
       WHERE FLIGHTDATAID = 7277) 
GROUP BY 
    QUESTIONID; 

Und ich dieses Ergebnis:

AVERAGE QUESTIONID COUNT 
------------------------- 
3.606060 115  99 
4.303030 109  99 
2.969696 118  99 
3.818181 112  99 
2.545454 113  99 
3.787878 121  99 
3.606060 110  99 
2.363636 119  99 
3.515151 116  99 
3.272727 117  99 
4.242424 111  99 
3.909090 120  99 
2.333333 114  99 

das ist schön und alle außer Die Zeile QUESTIONID ist nicht nach der ID von der niedrigsten zur höchsten angeordnet, was ich möchte. Ich habe die gleiche Abfrage auf einem anderen Flug, wo Dinge richtig angezeigt:

AVERAGE QUESTIONID COUNT 
-------------------------- 
3.000000 109  1 
3.000000 110  1 
3.000000 111  1 
3.000000 112  1 
0.000000 113  1 
0.000000 114  1 
3.000000 115  1 
0.000000 116  1 
3.000000 117  1 
3.000000 118  1 
0.000000 119  1 
3.000000 120  1 
3.000000 121  1 

Was mache ich falsch?

+5

Wenn Sie Dinge in einer bestimmten Reihenfolge wünschen, verwenden Sie 'order by questionid'. Die Reihenfolge der Ergebnisse zu ordnen ist nicht Aufgabe von 'group by'. –

+0

Aber ich kann 'ORDER BY' nicht verwenden:' Spalte 'AnswersRating.QUESTIONID' ist in der Auswahlliste ungültig, weil sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist. – OmniOwl

+1

'ORDER BY QUESTIONID' – Squirrel

Antwort

4

Wenn Sie eine bestimmte Reihenfolge für Ihre Ergebnisse wollen, müssen Sie ein ORDER BY geben, die nach dem GROUP BY in Klausel Reihenfolge kommt. Die beiden Klauseln schließen sich nicht gegenseitig aus:

SELECT AVG(CAST(RATING AS NUMERIC(18, 2))) AS AVERAGE, 
    QUESTIONID, 
    COUNT(QUESTIONID) AS COUNT 
FROM AnswersRating 
WHERE SURVEYID IN 
(
    SELECT ID 
    FROM SURVEYS 
    WHERE FLIGHTDATAID = 7277 
) 
GROUP BY QUESTIONID 
ORDER BY QUESTIONID; 

Ihre zweite Abfrage gibt die Ergebnisse rein zufällig zurück.

+1

Ooh ... Ich dachte nie, ich könnte Order By und Group By in der gleichen Abfrage verwenden ... derp oo Danke – OmniOwl

+0

Wenn es richtig ist klicken Sie als Antwort @vipar –

+0

Ja, aber ich kann noch nicht. Site sagt mir, ich muss warten. – OmniOwl

4

Warum verwenden Sie nicht Order By? Gruppieren bedeutet nicht, zu bestellen.

ORDER BY QUESTIONID;