Analyse des kumulativen Aggregationsprinzips von MySQL und Anwendungsbeispiele

Analyse des kumulativen Aggregationsprinzips von MySQL und Anwendungsbeispiele

Dieser Artikel veranschaulicht anhand von Beispielen die Prinzipien und die Verwendung der kumulativen MySQL-Aggregation. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Bei der kumulativen Aggregation werden Daten vom ersten Element in der Sequenz bis zum aktuellen Element aggregiert. Beispielsweise werden für jeden Mitarbeiter die kumulierte Anzahl von Bestellungen und die durchschnittliche Anzahl von Bestellungen vom Beginn jedes Monats bis heute zurückgegeben.

Für das Zeilennummernproblem gibt es zwei Lösungen: eine besteht in der Verwendung einer Unterabfrage und die andere in der Verwendung eines Join. Die Unterabfragemethode ist normalerweise intuitiver und lesbarer. Wenn jedoch eine Aggregation erforderlich ist, muss die Unterabfrage die Daten für jede Aggregation einmal scannen, während die Verbindungsmethode normalerweise nur einmal scannen muss, um das Ergebnis zu erhalten. Die folgende Abfrage verwendet einen Join, um das Ergebnis zu erhalten

WÄHLEN
 a.empid,
 a.Bestellmonat, a.Menge AS dieser Monat,
 SUM(b.qty) AS Gesamtsumme,
 CAST(AVG(Menge) AS DECIMAL(5,2)) AS Durchschnitt
VON emordert ein
INNER JOIN emorders b
  EIN a.empid=b.empid
  UND b.Bestellmonat <= a.Bestellmonat
GRUPPE NACH a.empid,a.ordermonth,a.qty
BESTELLEN NACH a.empid,a.ordermonth

Wenn Sie nur die kumulierten Bestellungen im Jahr 2015 abfragen möchten, können Sie die Where-Bedingung hinzufügen

WO DATE_FORMAT(a.Bestellmonat,'%Y')='2015' UND DATE_FORMAT(b.Bestellmonat,'%Y')='2015'

Die Ergebnisse sind wie folgt

Möglicherweise möchten Sie die Daten auch filtern, um beispielsweise nur die monatlichen Bestellungen jedes Mitarbeiters anzuzeigen, bis ein bestimmtes Ziel erreicht ist. Dabei gehen wir davon aus, dass die Gesamtzahl der Bestellungen jedes Mitarbeiters gezählt wird, bevor sie 1.000 erreicht.

Hier können wir den HAVING-Filter verwenden, um die Abfrage zu vervollständigen

WÄHLEN
 a.empid,
 a.Bestellmonat,a.Menge AS dieser Monat,
 SUM(b.qty) AS Gesamtsumme,
 CAST(AVG(Menge) AS DECIMAL(5,2)) AS Durchschnitt
VON emordert ein
INNER JOIN emorders b
  EIN a.empid=b.empid
  UND b.Bestellmonat <= a.Bestellmonat
WO DATE_FORMAT(a.Bestellmonat,'%Y')='2015' UND DATE_FORMAT(b.Bestellmonat,'%Y')='2015'
GRUPPE NACH a.empid,a.ordermonth,a.qty
HABEN insgesamt < 1000
BESTELLEN NACH a.empid,a.ordermonth

Die Situation in dem Monat, in dem die Zahl 1000 erreicht, wird hier nicht berücksichtigt. Wenn wir Statistiken erstellen möchten, wird die Situation etwas komplizierter. Wenn „Total <= 1000“ angegeben ist, werden Statistiken nur dann erstellt, wenn die Anzahl der Bestellungen für diesen Monat genau 1000 beträgt. Andernfalls werden für diesen Monat keine Statistiken erstellt. Daher kann die Filterung dieses Problems aus einem anderen Blickwinkel betrachtet werden. Wenn die kumulierte Bestellmenge weniger als 1000 beträgt, ist die Differenz zwischen der kumulierten Bestellmenge und den Bestellungen des Vormonats kleiner als 1000. Dabei kann auch der erste Monat mit einer Bestellmenge über 1000 gezählt werden. Daher lautet die SQL-Anweisung für diese Lösung wie folgt

WÄHLEN
 a.empid,
 a.Bestellmonat,a.Menge AS dieser Monat,
 SUM(b.qty) AS Gesamtsumme,
 CAST(AVG(Menge) AS DECIMAL(5,2)) AS Durchschnitt
VON emordert ein
INNER JOIN emorders b
  EIN a.empid=b.empid
  UND b.Bestellmonat <= a.Bestellmonat
WO DATE_FORMAT(a.Bestellmonat,'%Y')='2015' UND DATE_FORMAT(b.Bestellmonat,'%Y')='2015'
GRUPPE NACH a.empid,a.ordermonth,a.qty
HABEN Gesamtmenge < 1000
BESTELLEN NACH a.empid,a.ordermonth

Die Ergebnisse sind wie folgt

Wenn Sie nur die Daten für den Monat mit einer kumulierten Bestellzahl von 1000 und nicht für die vorherigen Monate zurückgeben möchten, können Sie die obige SQL-Anweisung ändern.

Filtern Sie weiter und fügen Sie die Bedingung hinzu, dass die kumulierte Bestellmenge größer oder gleich 1000 ist. Die SQL-Anweisung für dieses Problem lautet wie folgt:

WÄHLEN
 a.empid,
 a.Bestellmonat,a.Menge AS dieser Monat,
 SUM(b.qty) AS Gesamtsumme,
 CAST(AVG(Menge) AS DECIMAL(5,2)) AS Durchschnitt
VON emordert ein
INNER JOIN emorders b
  EIN a.empid=b.empid
  UND b.Bestellmonat <= a.Bestellmonat
WO DATE_FORMAT(a.Bestellmonat,'%Y')='2015' UND DATE_FORMAT(b.Bestellmonat,'%Y')='2015'
GRUPPE NACH a.empid,a.ordermonth,a.qty
HABEN total-a.qty < 1000 UND total >= 1000
BESTELLEN NACH a.empid,a.ordermonth

Die Ergebnisse sind wie folgt

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „MySQL-Abfragekenntnisse“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „MySQL-Protokolloperationskenntnisse“, „Zusammenfassung der MySQL-Transaktionsoperationskenntnisse“, „MySQL-gespeicherte Prozedurkenntnisse“ und „Zusammenfassung der MySQL-Datenbanksperrenkenntnisse“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

Das könnte Sie auch interessieren:
  • Nutzungs- und Leistungsoptimierungstechniken für die Aggregatfunktion „count“ in MySQL
  • Detaillierte Erläuterung der häufig verwendeten MySQL-Aggregatfunktionen
  • So fügen Sie bedingte Ausdrücke zu Aggregatfunktionen in MySql hinzu
  • php+mysql Open Source XNA-Aggregationsprogramm zum Download freigegeben
  • Mysql kann keine nicht aggregierten Spalten auswählen
  • Analyse der Verwendung von MySQL-Abfragesortierung und Abfrageaggregationsfunktionen
  • Detaillierte Erläuterung von Beispielen für MySQL-Einzeltabellenabfragevorgänge [Syntax, Einschränkungen, Gruppierung, Aggregation, Filterung, Sortierung usw.]
  • Analyse des Prinzips und der Verwendung der kontinuierlichen MySQL-Aggregation
  • MySQL-Gleitaggregation/Jahresaggregation – Prinzip und Anwendungsbeispielanalyse

<<:  Detaillierte Erläuterung des praktischen Protokolls zur Lösung der Netzwerkisolation durch Nginx

>>:  Fallstudie zur Übermittlung von HTML-Formularen

Artikel empfehlen

Webdesign-Tutorial (3): Designschritte und Denkweise

<br />Vorheriges Tutorial: Webdesign-Tutoria...

HTML-Optimierung beschleunigt Webseiten

Offensichtliches HTML, verstecktes „öffentliches ...

JS implementiert einfache Addition und Subtraktion von Warenkorbeffekten

In diesem Artikelbeispiel wird der spezifische JS...

Warum DOCTYPE HTML verwenden?

Sie wissen, dass der Browser ohne diese Option bei...

MySQL 8.0 Upgrade-Erfahrung

Inhaltsverzeichnis Vorwort 1. Deinstallieren Sie ...

Erklärung und Beispielverwendung von 4 benutzerdefinierten Anweisungen in Vue

Vier praktische Vue-Custom-Anweisungen 1. V-Wider...

Implementierung der MySQL5.7 mysqldump-Sicherung und -Wiederherstellung

MySQL-Sicherung Kaltes Backup:停止服務進行備份,即停止數據庫的寫入H...

Ein Leistungsfehler bei MySQL-Partitionstabellen

Inhaltsverzeichnis 2. Stapelanalyse mit pt-pmap 3...

Ursachen und Lösungen für den MySQL-Fehler „zu viele Verbindungen“

Inhaltsverzeichnis Kurzzusammenfassung Heute Mitt...

So stellen Sie LNMP und phpMyAdmin in Docker bereit

Umweltvorbereitung: Stellen Sie lnmp auf einem Ho...