2016-06-03 12 views
1

Ich benutze sql Server Management Studio 2012 und müssen eine Abfrage zu zeigen, welches Thema ein Schüler hat fehlgeschlagen ist (Bedingung für das Scheitern ist Punkt < 5.0) die meisten zum ersten Mal aus dieser TabelleVerwirren mit Abfrage in Sql

StudentID | SubjectID | First/Second_Time | Point. 
1  | 02  |   1   | 5.0 
2  | 04  |   2   | 7.0 
3  | 03  |   2   | 9  
... etc 

Hier sind Abfrage meines Lehrers:

SELECT SubjectID 
FROM Result(NAME OF the TABLE) 
WHERE [First/Second_Time] = 1 AND Point < 5 
GROUP BY SubjectID 
HAVING count(point) >= ALL 
(
    SELECT count(point) 
    FROM Result 
    WHERE [First/Second_Time] = 1 AND point < 5 
    GROUP BY SubjectID 
) 

ich verstehe den Grund nicht die mit Abfrage zu machen. Weil Count(point) immer >=all(select count(point) from Result where First/Second_Time=1 and point<5 group by SubjectID) ist, ist es nicht? und es zeigt nicht, dass das Thema die meisten Schüler zum ersten Mal scheitern. Vielen Dank im Voraus und Entschuldigung für mein schlechtes Englisch

+0

Sind Sie auf MySQL oder SQL-Server? –

+0

Ich bin auf SQL-Server – Wick

+0

MySQL ist nicht SQL Server. Wenn Sie SQL Server verwenden, fügen Sie keine Tags für andere DBMS wie MySQL hinzu. Tags sind hier sinnvoll - fügen Sie nur diejenigen hinzu, die für Ihre Frage relevant sind. Greife nicht einfach diejenigen an, die wie etwas klingen, was du zuvor gehört hast. Wenn Sie nicht sicher sind, ob das Tag gültig ist, lesen Sie die Beschreibung des Tags. Wenn Sie immer noch nicht sicher sind, fügen Sie es nicht hinzu; Jemand hier wird es für Sie hinzufügen, wenn es benötigt wird. Vielen Dank. –

Antwort

1

Die Unterabfrage gibt eine Liste zurück, wie oft ein Betreff fehlgeschlagen ist (beim ersten Versuch). Es könnte einfacher für Sie, um zu sehen, was es tut, wenn Sie es wie folgt ausführen:

SELECT SubjectID, count(point) 
    FROM Result 
    WHERE [First/Second_Time] = 1 AND point < 5 
    GROUP BY SubjectID 

Also, wenn jemand Mathe einmal zweimal und Wissenschaft versagt, würde die Unterabfrage zurück:

2 
1 

Sie wollen wissen Sie, welches Thema am meisten fehlgeschlagen ist (in diesem Fall war das Thema 2 oder öfter fehlgeschlagen, da dies die höchste Anzahl an Fehlern in Ihrer Unterabfrage ist). Sie zählen also erneut (auch Gruppierung nach Betreff), und verwenden Sie having, um nur Subjekte mit 2 oder mehr Fehlern (größer oder gleich dem höchsten Wert in Ihrer Unterabfrage) zurückzugeben.

SELECT SubjectID 
FROM Result 
WHERE [First/Second_Time] = 1 AND Point < 5 
GROUP BY SubjectID 
HAVING count(point)... 

Weitere Beispiele finden Sie unter https://msdn.microsoft.com/en-us/library/ms178543.aspx.

1

Klingt, als ob Sie an einem Projekt für eine Klasse arbeiten, also bin ich mir nicht einmal sicher, ob ich das beantworten soll, aber hier geht es. Die Frage ist warum die having Klausel. Haben Sie die Beschreibungen für having und all gelesen?

Alle "Vergleicht einen Skalarwert mit einer einspaltigen Gruppe von Werten". Der skalare Wert in diesem Fall ist count (Punkt) oder die Anzahl der Vorkommen einer Subjekt-ID mit einem Punkt kleiner als 5. Der einspaltige Satz ist in diesem Fall eine Liste der Anzahl der Vorkommen jedes Subjekts mit weniger als 5 Punkte.

Das Nettoergebnis des Vergleichs ist in der "> =". "Alle" wird nur dann als wahr ausgewertet, wenn es für jeden Wert in der Unterabfrage zutrifft. Die Unterabfrage gibt eine Reihe von Zählungen aller Subjekte zurück, die die Anforderung 5 und 1 für die Zeit < erfüllen. Wenn Sie drei Themen haben, die die Kriterien 5 und 1 erfüllen, und sie haben eine Häufigkeit von 1,2,3-mal, dann hat die Hauptabfrage drei "Haben" -Ergebnisse; 1,2,3. Jedes der Hauptabfrageergebnisse muss> = = jedes der Unterabfrageergebnisse für diesen Hauptwert sein, um "wahr" auszuwerten. Der erste Hauptwert 1 ist also Schritt für Schritt> = 1, aber nicht> = 2, also fällt 1, weil das "Haben" falsch ist. Der zweite Hauptwert 2 ist> = 1, ist> = 2, ist aber nicht> = 3, so dass er abfällt. Der dritte Wert, 3, ergibt "wahr" als> = 1, 2 und 3, sodass Sie das Objekt mit der höchsten Häufigkeit zurückgeben.

Dies ist ziemlich klar im Abschnitt "Bemerkungen" der MSDN-Diskussion des Schlüsselworts "Alle", aber nicht in Bezug auf Ihre spezifische Anwendung.

Denken Sie daran, MSDN ist unser Freund!

+0

Ich frage mich, können wir das gleiche mit Order by Desc tun? – Wick

+0

Absolut ... wählen Sie oben 1 Reihenfolge nach Anzahl ... Sie könnten wahrscheinlich die gleiche Aufgabe mit Max in der Unterabfrage (ziemlich sicher, dass ich das schon einmal getan habe), aber ich nahm an, dass die "Hier ist meine Lehrer-Abfrage" Kommentar Sie werden auf die alle Funktion –

+1

SELECT oben 1 SubjectID FROM Ergebnis (Name der Tabelle) WHERE [Second Time] = 1 UND Point <5 GROUP BY SubjectID ORDER BY Count (Point) desc –