2016-09-15 6 views
1

Ich hämmere meinen Kopf gegen die Wand, hier. Ich habe Dutzende von StackOverflow-Fragen untersucht, die ähnlich sind, und sie bringen mich näher, aber ich habe noch keinen gefunden, der das tut, was ich brauche. Ich habe Tausende von Fragen in einer Datenbank mit Antworten von mehreren Benutzern auf jede Frage. Ich muss die Antworten aggregieren, um die Anzahl der eindeutigen Antworten pro Frage anzuzeigen. Das ist der einfache Teil; Wo ich stolpere, ist das Hinzufügen einer Summenspalte, um die Gesamtzahl der Antworten für jede Frage anzuzeigen. Ich kann es tun, wenn ich die Where-Klausel auf bestimmte Fragen beschränke, aber ich versuche, wenn möglich alles in eine Abfrage zu bringen. Hier ist die Frage:Zählen (*) und Summe in der gleichen Zeile

select c.ID, a.userID. c.question, a.answer, count(a.answer) as cnt 
from NotableAnswers a, categories b, questions c 
where c.fkCategory = b.ID and a.questionID = c.ID and b.ID = 18 
Group By a.answer, c.ID, c.question 
Order By c.ID, answer asc 

Was ich brauche, ist eine Ergebnismenge, die wie diese zusammen mit der Summe von

ID | userID | Question | Answer | cnt | totcnt 
------------------------------------------------------------------ 
175 | 10318 |Favorite... |Dropbox  | 15 |  35 
175 | 10354 |Favorite... |Box   | 2 |  35 
175 | 10323 |Favorite... |Google Drive | 15 |  35 
175 | 103111 |Favorite... |Cubby   | 3 |  35 
186 | 10318 |Best IDE... |IntelliJ  | 4 |  12 
186 | 103613 |Best IDE... |Android Studio| 6 |  12 
186 | 103117 |Best IDE... |Eclipse  | 2 |  12 

Dieser Satz zeigt die Antwort als ein Aggregat und die Zählung dieser spezifischen Antwort aussieht die Anzahl der Antworten für jede einzelne Frage.

Alle und alle helfen sehr geschätzt.

Antwort

5

Zuerst lernen Sie, die richtige join Syntax zu verwenden. Einfache Regel: Nie Kommas in der FROM Klausel verwenden. Immer verwenden Sie die explizite JOIN Syntax.

Zweitens ist die Antwort Funktionen Fenster:

select q.ID, a.userID. q.question, a.answer, count(a.answer) as cnt, 
     sum(count(a.answer)) over (partition by q.id) as total_cnt 
from NotableAnswers a join 
    questions q 
    on a.questionID = q.ID join 
    categories c 
    on q.fkCategory = c.ID 
where c.ID = 18 
Group By a.answer, c.ID, c.question 
Order By q.ID, answer asc; 

Außerdem ist es besser, Tabelle Aliase zu verwenden, die Abkürzungen für die Tabellennamen sind nicht willkürlich Buchstaben.

+0

Ernsthaft zu schnell ... Ich war gerade dabei, dies zu posten. – scsimon

+0

Wie ist 'a.userID' in der' SELECT' Anweisung? Es ist nicht in der Gruppe von oder einer AGGREGATE-Funktion. – CodyMR

+0

Vielen Dank für die sehr schnelle Antwort und das sanfte Anstupsen zur richtigen Syntax. Ich nehme an, irgendwo da drin hätte ich erwähnen sollen, dass es nicht meine Frage ist, ich habe sie einfach geerbt. Aber das ist nicht relevant für das Problem und ich habe es geändert, um den Kontext ein wenig klarer zu machen, was bedeutet, dass ich vergessen habe, userID in die Group By aufzunehmen. Mein Fehler. Aber noch einmal vielen Dank für die schnelle, genaue und sehr hilfreiche Antwort. – crazybobcat