In SQL-Abfragen verwenden wir die Group by-Klausel, um Aggregatfunktionen anzuwenden.
- Aber wozu dient die Verwendung eines numerischen Werts anstelle eines Spaltennamens mit der Group by-Klausel? Zum Beispiel: Gruppiere nach 1.
In SQL-Abfragen verwenden wir die Group by-Klausel, um Aggregatfunktionen anzuwenden.
Antworten:
Dies ist eine wirklich schlechte Sache, um IMHO zu tun, und es wird in den meisten anderen Datenbankplattformen nicht unterstützt.
Die Gründe, warum Menschen es tun:
Die Gründe, warum es schlecht ist:
Es ist keine Selbstdokumentation - jemand muss die SELECT-Liste analysieren, um die Gruppierung herauszufinden. In SQL Server, das Cowboy-Who-know-what-will-happen-Gruppierungen wie MySQL nicht unterstützt, wäre dies tatsächlich etwas klarer.
es ist spröde - jemand kommt herein und ändert die SELECT-Liste, weil die Geschäftsbenutzer eine andere Berichtsausgabe wollten, und jetzt ist Ihre Ausgabe ein Durcheinander. Wenn Sie in GROUP BY Spaltennamen verwendet hätten, wäre die Reihenfolge in der SELECT-Liste irrelevant.
SQL Server unterstützt ORDER BY [ordinal]; Hier sind einige parallele Argumente gegen seine Verwendung:
Mit MySQL können Sie GROUP BY
Aliase bearbeiten ( Probleme mit Spalten- Aliasen ). Das wäre weitaus besser als GROUP BY
mit Zahlen.
column number
in SQL-Diagrammen . Eine Zeile sagt: Sortiert das Ergebnis nach der angegebenen Spaltennummer oder nach einem Ausdruck. Wenn der Ausdruck ein einzelner Parameter ist, wird der Wert als Spaltennummer interpretiert. Negative Spaltennummern kehren die Sortierreihenfolge um.Google hat viele Beispiele für die Verwendung und warum viele es nicht mehr verwenden.
Um ehrlich zu sein, habe ich für ORDER BY
und GROUP BY
seit 1996 keine Spaltennummern verwendet (ich habe zu der Zeit Oracle PL / SQL-Entwicklung durchgeführt). Die Verwendung von Spaltennummern ist wirklich für Oldtimer gedacht, und die Abwärtskompatibilität ermöglicht es solchen Entwicklern, MySQL und andere RDBMSs zu verwenden, die dies noch zulassen.
Betrachten Sie den folgenden Fall:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Apps | 1 |
| 2016-05-31 | Applications | 1 |
| 2016-05-31 | Applications | 1 |
| 2016-05-31 | Apps | 1 |
| 2016-05-31 | Videos | 1 |
| 2016-05-31 | Videos | 1 |
| 2016-06-01 | Apps | 3 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Videos | 2 |
| 2016-06-01 | Apps | 2 |
+------------+--------------+-----------+
Sie müssen die Anzahl der Downloads pro Dienst und Tag ermitteln, wenn Sie Apps und Anwendungen als denselben Dienst betrachten. Eine Gruppierung nach date, services
würde zu separaten Diensten führen Apps
und Applications
als solche betrachtet werden.
In diesem Fall wäre die Abfrage:
select date, services, sum(downloads) as downloads
from test.zvijay_test
group by date,services
Und Ausgabe:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Apps | 2 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Apps | 5 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Dies ist jedoch nicht das, was Sie möchten, da die Gruppierung von Anwendungen und Apps die Voraussetzung ist. Also was können wir tun?
Eine Möglichkeit besteht darin, Apps
durch die Applications
Verwendung eines CASE
Ausdrucks oder der IF
Funktion zu ersetzen und diese dann über Dienste zu gruppieren als:
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,services
Aber diese noch Gruppen Dienstleistungen unter Berücksichtigung Apps
und Applications
als unterschiedliche Dienste und gibt die gleiche Leistung wie vorher:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Applications | 5 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Durch Gruppieren über eine Spaltennummer können Sie Daten in einer mit Alias versehenen Spalte gruppieren.
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,2;
Und so erhalten Sie die gewünschte Ausgabe wie folgt:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 4 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 9 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Ich habe oft gelesen, dass dies eine träge Methode zum Schreiben von Abfragen oder zum Gruppieren über eine mit Alias versehene Spalte ist, die in MySQL nicht funktioniert. Dies ist jedoch die Methode zum Gruppieren über mit Alias versehene Spalten.
Dies ist nicht die bevorzugte Methode zum Schreiben von Abfragen. Verwenden Sie diese Methode nur, wenn Sie eine Gruppierung über eine Alias-Spalte durchführen müssen.
Es gibt keinen gültigen Grund, es zu verwenden. Es ist einfach eine faule Abkürzung, die speziell dafür entwickelt wurde, es einigen hartnäckigen Entwicklern zu erschweren, Ihre Gruppierung oder Sortierung zu einem späteren Zeitpunkt herauszufinden oder zuzulassen, dass der Code kläglich versagt, wenn jemand die Spaltenreihenfolge ändert. Seien Sie rücksichtsvoll gegenüber Ihren Mitentwicklern und tun Sie es nicht.
Das ist für mich gearbeitet. Der Code gruppiert die Zeilen in bis zu 5 Gruppen.
SELECT
USR.UID,
USR.PROFILENAME,
(
CASE
WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN
@curRow := 0
ELSE
@curRow := @curRow + 1
/*@curRow := 1*/ /*AND @curCode := USR.UID*/
END
) AS sort_by_total
FROM
SS_USR_USERS USR,
(
SELECT
@curRow := 0,
@curCode := ''
) rt
ORDER BY
USR.PROFILENAME,
USR.UID
Das Ergebnis ist wie folgt
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2;
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3;
Betrachten Sie die obigen Fragen: Gruppieren nach 1 bedeutet Gruppieren nach der ersten Spalte und Gruppieren nach 1,2 bedeutet Gruppieren nach der ersten und zweiten Spalte und Gruppieren nach 1,2,3 bedeutet Gruppieren nach der ersten zweiten und dritten Spalte. Zum Beispiel:
Dieses Bild zeigt die ersten beiden Spalten, gruppiert nach 1,2, dh es werden nicht die unterschiedlichen Werte von dep_date berücksichtigt, um den Zählerstand zu ermitteln (um den Zählerstand zu berechnen, werden alle unterschiedlichen Kombinationen der ersten beiden Spalten berücksichtigt), wohingegen die zweite Abfrage dies bewirkt
Bild. Hierbei werden alle ersten drei Spalten berücksichtigt und es werden unterschiedliche Werte zum Ermitteln der Anzahl verwendet, dh es wird eine Gruppierung nach allen ersten drei Spalten durchgeführt (um die Anzahl zu berechnen, werden alle unterschiedlichen Kombinationen der ersten drei Spalten berücksichtigt).
order by 1
nur , wenn in der Sitzungmysql>
prompt. Verwenden Sie im CodeORDER BY id ASC
. Beachten Sie den Fall, den expliziten Feldnamen und die explizite Reihenfolge.