Verarbeitung mehrerer Ergebniszeilen bei der SQL-Gruppierung und -Sortierung
Bei Abfragen, die Daten gruppieren und sortieren, kommt es häufig zu dieser Situation: mehrere Zeilen mit demselben Gruppierungsschlüssel, aber unterschiedlichen Werten für andere Spalten. Dies kann den Erhalt der erforderlichen aggregierten Daten verhindern.
Zum Beispiel kann eine Abfrage, die Daten nach Hardwaremodell gruppiert, mehrere Zeilen mit unterschiedlichen „Ergebnissen“ für dasselbe Modell zurückgeben. Um dies in einer Zeile pro Modell zusammenzufassen, können Sie die Abfrage so ändern, dass tatsächliche 0-Werte zu 0-Werten führen und Werte ungleich Null zu 1-Werten führen. Dieser Ansatz erzeugt jedoch immer noch mehrere Zeilen für Modelle mit mehreren „Ergebnis“-Werten.
Der Schlüssel zum Erreichen der gewünschten Aggregation liegt in der Gruppierung nach dem CASE-Ausdruck und nicht nach der Quellspalte, die das Ergebnis darstellt. Durch die Gruppierung nach Bedingungswert kann eine Abfrage Zeilen mit demselben Gruppierungsschlüssel und demselben Bedingungsergebnis kombinieren.
Beispielsweise gruppiert die folgende Abfrage nach Modellname, Versuchstyp und CASE-Ausdruck, der zum Konvertieren des Ergebniswerts verwendet wird:
<code class="language-sql">SELECT CURRENT_DATE-1 AS day, model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END, count(*) FROM attempt attempt, prod_hw_id prod_hw_id, model model WHERE time >= '2013-11-06 00:00:00' AND time < '2013-11-07 00:00:00' GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END ORDER BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END;</code>
Alternativ können Sie den Spaltenalias des CASE-Ausdrucks verwenden, um ihn von der Ergebnisquellenspalte zu unterscheiden:
<code class="language-sql">SELECT CURRENT_DATE-1 AS day, model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1, count(*) FROM attempt attempt, prod_hw_id prod_hw_id, model model WHERE time >= '2013-11-06 00:00:00' AND time < '2013-11-07 00:00:00' GROUP BY model.name, attempt.type, result1 ORDER BY model.name, attempt.type, result1;</code>
Es ist wichtig zu bedenken, dass die Gruppierung nach CASE-Ausdrücken mithilfe von Positionsverweisen (z. B. „GROUP BY 1,2,3“) resistenter gegen Änderungen in der SELECT-Liste ist als die Verwendung von Spaltennamen in der GROUP BY-Klausel.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit mehreren Ergebniszeilen um, wenn ich Daten in SQL gruppiere und anordne?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!