SQL-Aggregatfunktionen – SUM, MIN, MAX, AVG, COUNT. Berechnungen in SQL. Erstellen berechneter Felder

SQL – Lektion 8. Datensätze gruppieren und die Funktion COUNT()

Erinnern wir uns daran, welche Botschaften und zu welchen Themen wir haben. Dazu können Sie die übliche Abfrage verwenden:

Was wäre, wenn wir nur herausfinden müssten, wie viele Nachrichten es im Forum gibt? Dazu können Sie die integrierte Funktion nutzen ZÄHLEN(). Diese Funktion zählt die Anzahl der Zeilen. Wenn außerdem * als Argument für diese Funktion verwendet wird, werden alle Zeilen der Tabelle gezählt. Und wenn ein Spaltenname als Argument angegeben wird, werden nur die Zeilen gezählt, die einen Wert in der angegebenen Spalte haben.

In unserem Beispiel liefern beide Argumente das gleiche Ergebnis, weil Alle Tabellenspalten sind NICHT NULL. Schreiben wir eine Abfrage mit der Spalte id_topic als Argument:

SELECT COUNT(id_topic) FROM posts;

Es gibt also 4 Nachrichten in unseren Themen. Was aber, wenn wir wissen möchten, wie viele Nachrichten es in jedem Thema gibt? Dazu müssen wir unsere Nachrichten nach Themen gruppieren und die Anzahl der Nachrichten für jede Gruppe berechnen. Verwenden Sie zum Gruppieren in SQL den Operator GRUPPE NACH. Unsere Anfrage wird nun so aussehen:

SELECT id_topic, COUNT(id_topic) FROM posts GROUP BY id_topic;

Operator GRUPPE NACH weist das DBMS an, die Daten nach der Spalte „id_topic“ zu gruppieren (d. h. jedes Thema ist eine separate Gruppe) und die Anzahl der Zeilen für jede Gruppe zu zählen:

Nun, im Thema mit der ID=1 haben wir 3 Nachrichten und mit der ID=4 eine. Wären übrigens fehlende Werte im Feld id_topic möglich, dann würden solche Zeilen zu einer separaten Gruppe mit dem Wert NULL zusammengefasst.

Nehmen wir an, dass uns nur die Gruppen interessieren, die mehr als zwei Nachrichten haben. In einer normalen Abfrage würden wir die Bedingung mithilfe des Operators angeben WO, aber dieser Operator kann nur mit Zeichenfolgen arbeiten und für Gruppen werden dieselben Funktionen vom Operator ausgeführt HABEN:

SELECT id_topic, COUNT(id_topic) FROM posts GROUP BY id_topic HAVING COUNT(id_topic) > 2;

Als Ergebnis haben wir:

In Lektion 4 haben wir uns angeschaut, welche Bedingungen vom Betreiber eingestellt werden können WO, können die gleichen Bedingungen vom Betreiber vorgegeben werden HABEN, das musst du dir nur merken WO Filtert Zeichenfolgen und HABEN- Gruppen.

Heute haben wir gelernt, wie man Gruppen erstellt und wie man die Anzahl der Zeilen in einer Tabelle und in Gruppen zählt. Im Allgemeinen zusammen mit dem Betreiber GRUPPE NACH Sie können andere integrierte Funktionen verwenden, wir werden sie jedoch später untersuchen.

Lernen wir zusammenzufassen. Nein, das sind nicht die Ergebnisse des Studiums von SQL, sondern die Ergebnisse der Werte der Spalten der Datenbanktabellen. SQL-Aggregatfunktionen verarbeiten die Werte einer Spalte, um einen einzelnen resultierenden Wert zu erzeugen. Die am häufigsten verwendeten SQL-Aggregatfunktionen sind SUM, MIN, MAX, AVG und COUNT. Bei der Verwendung von Aggregatfunktionen ist zwischen zwei Fällen zu unterscheiden. Erstens werden Aggregatfunktionen eigenständig verwendet und geben einen einzelnen Ergebniswert zurück. Zweitens werden Aggregatfunktionen mit der SQL-GROUP BY-Klausel verwendet, d. h. die Gruppierung nach Feldern (Spalten), um die resultierenden Werte in jeder Gruppe zu erhalten. Betrachten wir zunächst Fälle der Verwendung von Aggregatfunktionen ohne Gruppierung.

SQL SUM-Funktion

Die SQL SUM-Funktion gibt die Summe der Werte in einer Datenbanktabellenspalte zurück. Es kann nur auf Spalten angewendet werden, deren Werte Zahlen sind. Die SQL-Abfragen, um die resultierende Summe zu erhalten, beginnen wie folgt:

SUMME AUSWÄHLEN (COLUMN_NAME) ...

Auf diesen Ausdruck folgt FROM (TABLE_NAME). Anschließend kann mithilfe der WHERE-Klausel eine Bedingung angegeben werden. Darüber hinaus kann dem Spaltennamen DISTINCT vorangestellt werden, was bedeutet, dass nur eindeutige Werte gezählt werden. Standardmäßig werden alle Werte berücksichtigt (hierfür können Sie gezielt nicht DISTINCT, sondern ALL angeben, das Wort ALL ist jedoch nicht erforderlich).

Beispiel 1. Es gibt eine Unternehmensdatenbank mit Daten zu den Unternehmensbereichen und Mitarbeitern. Die Personaltabelle enthält auch eine Spalte mit Daten zu den Gehältern der Mitarbeiter. Die Auswahl aus der Tabelle sieht so aus (zum Vergrößern des Bildes mit der linken Maustaste darauf klicken):

Um die Summe aller Gehälter zu erhalten, verwenden Sie die folgende Abfrage:

WÄHLEN SIE SUMME (Gehalt) AUS „Mitarbeiter“.

Diese Abfrage gibt den Wert 287664,63 zurück.

Und jetzt. In den Übungen beginnen wir bereits, die Aufgaben zu verkomplizieren und sie der Praxis anzunähern.

SQL MIN-Funktion

Die SQL-MIN-Funktion arbeitet auch mit Spalten, deren Werte Zahlen sind, und gibt das Minimum aller Werte in der Spalte zurück. Diese Funktion hat eine ähnliche Syntax wie die SUM-Funktion.

Beispiel 3. Die Datenbank und die Tabelle sind die gleichen wie in Beispiel 1.

Wir müssen den Mindestlohn für Mitarbeiter der Abteilung Nr. 42 ermitteln. Schreiben Sie dazu folgenden Antrag:

Die Abfrage gibt den Wert 10505,90 zurück.

Und noch einmal Übung zur Selbstlösung. In dieser und einigen anderen Übungen benötigen Sie nicht nur die Staff-Tabelle, sondern auch die Org-Tabelle, die Daten über die Unternehmensbereiche enthält:


Beispiel 4. Die Org-Tabelle wird zur Staff-Tabelle hinzugefügt und enthält Daten über die Abteilungen des Unternehmens. Drucken Sie die Mindestarbeitsjahre eines Mitarbeiters in einer Abteilung in Boston aus.

SQL MAX-Funktion

Die SQL-MAX-Funktion funktioniert ähnlich und hat eine ähnliche Syntax, die verwendet wird, wenn Sie den Maximalwert aller Werte in einer Spalte ermitteln müssen.

Beispiel 5.

Sie müssen das Höchstgehalt der Mitarbeiter der Abteilung Nr. 42 ermitteln. Schreiben Sie dazu die folgende Anfrage:

Die Abfrage gibt den Wert 18352,80 zurück

Die Zeit ist gekommen Übungen zur eigenständigen Lösung.

Beispiel 6. Wir arbeiten wieder mit zwei Tabellen – Staff und Org. Zeigen Sie den Namen der Abteilung und den Höchstwert der Provision an, die ein Mitarbeiter in der Abteilung erhält, die zur Abteilungsgruppe (Abteilung) Ost gehört. Verwenden JOIN (Tabellen verbinden) .

SQL AVG-Funktion

Was zur Syntax der zuvor beschriebenen Funktionen gesagt wurde, gilt auch für die SQL-AVG-Funktion. Diese Funktion gibt den Durchschnitt aller Werte in einer Spalte zurück.

Beispiel 7. Die Datenbank und die Tabelle sind dieselben wie in den vorherigen Beispielen.

Angenommen, Sie möchten die durchschnittliche Betriebszugehörigkeit der Mitarbeiter in der Abteilung Nr. 42 ermitteln. Schreiben Sie dazu die folgende Abfrage:

Das Ergebnis wird 6,33 sein

Beispiel 8. Wir arbeiten mit einem Tisch – dem Personal. Zeigen Sie das Durchschnittsgehalt von Mitarbeitern mit 4 bis 6 Jahren Berufserfahrung an.

SQL COUNT-Funktion

Die SQL COUNT-Funktion gibt die Anzahl der Datensätze in einer Datenbanktabelle zurück. Wenn Sie in der Abfrage SELECT COUNT(COLUMN_NAME) ... angeben, ist das Ergebnis die Anzahl der Datensätze ohne Berücksichtigung derjenigen Datensätze, in denen der Spaltenwert NULL (undefiniert) ist. Wenn Sie als Argument ein Sternchen verwenden und eine SELECT COUNT(*) ...-Abfrage starten, ist das Ergebnis die Anzahl aller Datensätze (Zeilen) der Tabelle.

Beispiel 9. Die Datenbank und die Tabelle sind dieselben wie in den vorherigen Beispielen.

Sie möchten die Anzahl aller Mitarbeiter wissen, die Provisionen erhalten. Die Anzahl der Mitarbeiter, deren Comm-Spaltenwerte nicht NULL sind, wird von der folgenden Abfrage zurückgegeben:

WÄHLEN SIE COUNT (Comm) FROM Staff

Das Ergebnis wird 11 sein.

Beispiel 10. Die Datenbank und die Tabelle sind dieselben wie in den vorherigen Beispielen.

Wenn Sie die Gesamtzahl der Datensätze in der Tabelle ermitteln möchten, verwenden Sie eine Abfrage mit einem Sternchen als Argument für die COUNT-Funktion:

WÄHLEN SIE ANZAHL (*) AUS STABIL

Das Ergebnis wird 17 sein.

Im nächsten Übung zur eigenständigen Lösung Sie müssen eine Unterabfrage verwenden.

Beispiel 11. Wir arbeiten mit einem Tisch – dem Personal. Zeigen Sie die Anzahl der Mitarbeiter in der Planungsabteilung (Plains) an.

Aggregieren Sie Funktionen mit SQL GROUP BY

Schauen wir uns nun die Verwendung von Aggregatfunktionen zusammen mit der SQL-Anweisung GROUP BY an. Die SQL-Anweisung GROUP BY wird verwendet, um Ergebniswerte nach Spalten in einer Datenbanktabelle zu gruppieren. Die Website hat Eine Lektion, die diesem Operator separat gewidmet ist .

Beispiel 12. Es gibt eine Datenbank des Anzeigenportals. Es verfügt über eine Anzeigentabelle mit Daten zu den für die Woche eingereichten Anzeigen. Die Spalte „Kategorie“ enthält Daten zu großen Anzeigenkategorien (z. B. „Immobilien“) und die Spalte „Teile“ enthält Daten zu kleineren Teilen, die in den Kategorien enthalten sind (z. B. sind die Teile „Wohnungen“ und „Sommerhäuser“ Teile der Kategorie „Immobilien“). Die Spalte „Einheiten“ enthält Daten über die Anzahl der eingereichten Anzeigen und die Spalte „Geld“ enthält Daten über den Geldbetrag, der für die Einreichung von Anzeigen erhalten wurde.

KategorieTeilEinheitenGeld
TransportAutos110 17600
ImmobilieWohnungen89 18690
ImmobilieDachas57 11970
TransportMotorräder131 20960
BaumaterialienBretter68 7140
ElektrotechnikFernseher127 8255
ElektrotechnikKühlschränke137 8905
BaumaterialienRegips112 11760
FreizeitBücher96 6240
ImmobilieZu Hause47 9870
FreizeitMusik117 7605
FreizeitSpiele41 2665

Ermitteln Sie mithilfe der SQL-Anweisung „GROUP BY“, wie viel Geld Sie mit der Schaltung von Anzeigen in den einzelnen Kategorien verdienen. Wir schreiben folgende Anfrage:

Kategorie auswählen, Summe (Geld) als Geld aus Anzeigen, nach Kategorie gruppieren

Beispiel 13. Die Datenbank und die Tabelle sind dieselben wie im vorherigen Beispiel.

Finden Sie mit der SQL-Anweisung GROUP BY heraus, welcher Teil jeder Kategorie die meisten Einträge hatte. Wir schreiben folgende Anfrage:

WÄHLEN Sie Kategorie, Teil, MAX (Einheiten) ALS Maximum AUS Anzeigen, GRUPPE NACH Kategorie

Das Ergebnis wird die folgende Tabelle sein:

Gesamt- und Einzelwerte können in einer Tabelle ermittelt werden Kombinieren von Abfrageergebnissen mit dem UNION-Operator .

Relationale Datenbanken und SQL-Sprache

Ich habe eine Anfrage wie:

SELECT i.*, COUNT(*) AS-Währungen, SUM(ig.quantity) AS total, SUM(g.price * ig.quantity) AS-Preis, c.kurz AS cname FROM bill AS i, bill_goods AS ig, good g LEFT JOIN Währung c ON (c.id = g.currency) WHERE ig.invoice_id = i.id AND g.id = ig.good_id GROUP BY g.currency ORDER BY i.date DESC;

diese. Es wird eine Liste von Bestellungen ausgewählt, in der die Gesamtkosten der Waren in verschiedenen Währungen berechnet werden (die Währung ist für das Produkt festgelegt, die Spalte cname im Ergebnis ist der Name der Währung).

Sie müssen die Anzahl der Datensätze mit derselben i.id in der Währungsergebnisspalte ermitteln. Experimente mit den COUNT()-Parametern haben jedoch zu nichts geführt – es wird immer 1 zurückgegeben

Frage: Ist es möglich, den wahren Wert in der Währungsspalte zu ermitteln? Diese. Wenn Waren mit Preisen in 3 verschiedenen Währungen bestellt werden, Währungen=3 ?

Allerdings lässt sich MySQL in Bezug auf SQL zu viele Freiheiten. Was bedeutet zum Beispiel i.* im Kontext dieser Auswahl? Alle Spalten der Rechnungstabelle? Da für sie keine Gruppierungsfunktion gilt, wäre es schön, wenn sie in GROUP BY aufgeführt würden, da sonst das Prinzip der Gruppierung von Zeilen nicht ganz klar ist. Wenn Sie alle Waren für alle Bestellungen nach Währung erhalten müssen, ist das eine Sache. Wenn Sie alle Waren für jede Bestellung nach Währung gruppiert erhalten müssen, ist das eine völlig andere Sache.
Basierend auf Ihrer Auswahl können wir von der folgenden Datenstruktur ausgehen:
Rechnungstabelle:

Tabelle „Invoice_goods“:

Warentisch:

Währungstabelle:

Was wird Ihre aktuelle Auswahl zurückgeben? Theoretisch werden für jede Bestellung und jede Währung, in der diese Bestellung Waren enthält, N-Zeilen zurückgegeben. Aufgrund der Tatsache, dass in group by jedoch nichts anderes als g.currency angegeben ist, ist dies nicht offensichtlich :) Darüber hinaus trägt die c.briefly-Spalte auch zur impliziten Bildung von Gruppen bei. Als Ergebnis erhalten wir für jede eindeutige Kombination von i.*, g.currency und c.briefly eine Gruppe, auf deren Zeilen die Funktionen SUM und COUNT angewendet werden. Die Tatsache, dass Sie beim Herumspielen mit dem COUNT-Parameter immer 1 erhalten haben, bedeutet, dass es in der resultierenden Gruppe nur einen Datensatz gab (d. h. die Gruppen wurden nicht wie gewünscht gebildet. Können Sie die Anforderungen genauer beschreiben?). Aus Ihrer Frage geht nicht klar hervor, was Sie wissen möchten: Wie viele verschiedene Währungen waren an der Bestellung beteiligt oder wie viele Bestellungen waren in einer bestimmten Währung? Im ersten Fall sind mehrere Optionen möglich, alles hängt von den Fähigkeiten von MySQL ab; im zweiten Fall müssen Sie den Auswahlausdruck anders schreiben.

Allerdings lässt sich MySQL in Bezug auf SQL zu viele Freiheiten. Was bedeutet zum Beispiel i.* im Kontext dieser Auswahl? Alle Spalten der Rechnungstabelle?

Ja, genau. Das spielt aber keine große Rolle, denn... In diesem Fall sind darunter keine sinnvollen Spalten. Sei i.* i.id . Um genau zu sein.

Was wird Ihre aktuelle Auswahl zurückgeben? Theoretisch werden für jede Bestellung und jede Währung, in der diese Bestellung Waren enthält, N-Zeilen zurückgegeben. Aber aufgrund der Tatsache, dass „group by“ nichts anderes als „g.currency“ angibt, ist dies nicht offensichtlich :),

Das ist richtig.
Es wird Folgendes zurückgegeben (in diesem Beispiel wähle ich aus i nur id und nicht alle Spalten aus):

AusweisWährungengesamtPreiscname
33 1 1.00 198.00 B.F.
33 1 4.00 1548.04 REIBEN
Darüber hinaus trägt die c.briefly-Spalte auch zur impliziten Gruppenbildung bei.

Wie? Tabellen werden durch c.id=g.currency verbunden und nach g.currency gruppiert.

Die Tatsache, dass Sie beim Spielen mit dem COUNT-Parameter immer 1 erhalten haben, bedeutet, dass es in der resultierenden Gruppe nur einen Datensatz gab

Nein, die Gruppe wurde daraus aufgebaut 1 Aufzeichnungen. Soweit ich das verstehe, gibt COUNT() aus diesem Grund 1 zurück (schließlich werden die in der Gruppe unterschiedlichen Spalten (allerdings mit Ausnahme der Währungsspalte) durch Aggregatfunktionen erstellt).

(d. h. die Gruppen werden nicht so gebildet, wie Sie es möglicherweise benötigen. Können Sie die Anforderungen genauer beschreiben?).

Gruppen werden nach Bedarf gebildet, jede Gruppe -- Das Gesamtkosten der Waren in jeder Währung. Abgesehen davon habe ich jedoch Ich muss berechnen, wie viel Dasselbe Elemente in Das Gruppe.

Aus Ihrer Frage geht nicht klar hervor, was Sie wissen möchten: Wie viele verschiedene Währungen waren an der Bestellung beteiligt oder wie viele Bestellungen waren in einer bestimmten Währung?

Ja, ich habe ein bisschen Geld verdient. Nur das erste.

dmig[Dossier]
Mit „impliziter“ Teilnahme an der Bildung einer Gruppe meine ich, dass das Ergebnis der Auswahl identisch ist, wenn die Spalte nicht in GROUP BY angegeben ist und gleichzeitig KEIN Argument für die Gruppenfunktion ist Was wäre, wenn diese Spalte in GROUP BY angegeben WÄRE. Ihre Auswahl und die Auswahl unten führen zu genau demselben Ergebnis (achten Sie nicht auf die Verknüpfungen, ich habe sie nur in ein einziges Aufnahmeformat gebracht):

Wählen Sie i.id id, count(*) Währungen, sum(ig.quantity) total, SUM(g.price * ig.quantity) Preis, c.kurz cname FROM Rechnung aus, ich schließe Rechnung_Waren an (ig.invoice_id = i. id) beitreten gut g on (g.id = ig.good_id) LEFT OUTER JOIN Währung c ON (c.id = g.currency) gruppieren nach i.id, c.briefly

Es stellt sich heraus, dass es in jeder Zeile der resultierenden Stichprobe eine und nur eine Währung gibt (wäre sie unterschiedlich, gäbe es zwei Zeilen). Von wie vielen Elementen reden wir in diesem Fall? Über Bestellartikel? Dann ist Ihre Auswahl absolut richtig, nur für diese Währung gibt es in dieser Bestellung nur einen Artikel.
Schauen wir uns das Datenschema an:

  1. Es gibt viele Artikel (Zeilen) in einer Bestellung, oder?
  2. Jeder Artikel ist ein Produkt im Warenverzeichnis, oder?
  3. Jedes Produkt hat eine bestimmte (und nur eine) Währung, das ergibt sich aus c.id = g.currency, oder?

Wie viele Währungen sind in der Bestellung enthalten? Darin sind ebenso viele Punkte mit VERSCHIEDENEN Währungen enthalten.
Das Addieren von g.price * ig.quantity macht nur für Punkte in einer Währung Sinn ;) (obwohl auch Kilometer mit Stunden addiert werden können :) Was passt also nicht zu Ihnen!? Sie geben an, dass Sie benötigen, wie viele verschiedene Währungen an der Bestellung beteiligt waren
und in diesem Fall wird es nicht funktionieren, dies im Rahmen derselben Auswahl ohne alle möglichen Tricks zu tun (was MySQL höchstwahrscheinlich nicht tun wird);(
Leider bin ich kein MySQL-Experte. In Oracle können Sie dies mit einem Select tun, aber hilft Ihnen dieser Rat? Kaum ;)

# Es gibt viele Artikel (Zeilen) in einer Bestellung, oder?
# Jeder Artikel ist ein Produkt im Warenverzeichnis, oder?
# Jedes Produkt hat eine bestimmte (und nur eine) Währung, das ergibt sich aus c.id = g.currency, oder?

Also.
Eine Bestellung: ein Datensatz in der Rechnungstabelle, er entspricht n(>0) Datensätzen in bill_goods, von denen jeder einem Datensatz in der Warentabelle entspricht, der Datensatz „Währung“ in jedem von ihnen entspricht wiederum dem 1. Datensatz in der Währungstabelle (LEFT JOIN – im Falle der Bearbeitung des Währungsverzeichnisses mit krummen Händen – Tabellen wie MyISAM unterstützen keine Fremdschlüssel).

Wie viele Währungen sind in der Bestellung enthalten? Darin sind ebenso viele Punkte mit VERSCHIEDENEN Währungen enthalten.

Ja, das stimmt.

Das Hinzufügen von g.price * ig.quantity ist nur für Punkte in einer Währung sinnvoll;) (obwohl auch Kilometer mit Stunden hinzugefügt werden können :)

Aus diesem Grund erfolgt die Gruppierung nach Währungs-ID (g.currency).

In Oracle können Sie dies mit einem Select tun, aber hilft Ihnen dieser Rat?

M.b.
Ich habe ein wenig mit Oracle gesprochen und bin mit pl/sql vertraut.

Option Nr. 1.

Wählen Sie a.*, count(*) über (partitionieren Sie durch a.id) Währungen aus (select i.id id, sum(ig.quantity) total, SUM(g.price * ig.quantity) price, c.shortly cname FROM Rechnung verbinde ich Rechnung_Waren ig auf (ig.invoice_id = i.id) verbinde Ware g auf (g.id = ig.good_id) LEFT OUTER JOIN Währung c ON (c.id = g.Währung) gruppieren nach i.id, c.kurz)a

Dabei kommt das sogenannte zum Einsatz analytische Funktion. Mit einer Wahrscheinlichkeit von 99 % funktioniert es in MySQL NICHT.

Option Nr. 2.
Es wird eine Funktion erstellt, zum Beispiel countCurrencies, die basierend auf der Bestell-ID die Anzahl der daran beteiligten Währungen zurückgibt und dann:

Wählen Sie i.id id, countCurrencies(i.id) Währungen, sum(ig.quantity) total, SUM(g.price * ig.quantity) Preis, c.kurz cname FROM Rechnung aus, ich schließe Rechnung_Waren ig an (ig.invoice_id = i.id) gut g beitreten on (g.id = ig.good_id) LEFT OUTER JOIN Währung c ON (c.id = g.currency) gruppieren nach i.id, c.briefly, countCurrencies(i.id)

Es mag funktionieren, aber es wird für jede Währung jeder Bestellung aufgerufen. Ich weiß nicht, ob MySQL Ihnen erlaubt, GROUP BY nach Funktion auszuführen ...

Option Nr. 3

Wählen Sie i.id id, agr.cnt-Währungen, sum(ig.quantity) total, SUM(g.price * ig.quantity) preis, c.kurz cname FROM Rechnung aus, ich schließe Rechnung_Waren ig an (ig.invoice_id = i.id ) gut verbinden, weitermachen (g.id = ig.good_id) LEFT OUTER JOIN Währung c ON (c.id = g.Währung) linker äußerer Join (wählen Sie ii.id, count(distinct gg.currency) cnt von Rechnung ii, invoce_goods iig, good gg where ii.id = iig.invoice_id and gg.id = iig.good_id group by ii.id) agr on (i.id = agr.id) group by i.id, c.briefly, agr. cnt

Wahrscheinlich die korrekteste ... und wahrscheinlich die funktionierendste Option von allen.

Am schnellsten geht es mit Option Nr. 1. Nr. 2 ist am unwirksamsten, weil Je mehr Währungen in der Reihenfolge vorhanden sind, desto häufiger werden sie gezählt.
Nr. 3 ist grundsätzlich auch nicht die beste Geschwindigkeit, aber immerhin kann man sich auf das Caching innerhalb des DBMS verlassen.

Das Ergebnis aller drei Auswahlen wird wie folgt sein:

AusweisWährungengesamtPreiscname
33 2 1.00 198.00 B.F.
33 2 4.00 1548.04 REIBEN

Für die gleiche ID ist die Zahl in der Spalte „Währungen“ immer dieselbe. Brauchen Sie das?

Beschreibt die Verwendung arithmetischer Operatoren und die Konstruktion berechneter Spalten. Berücksichtigt werden die finalen (Aggregat-)Funktionen COUNT, SUM, AVG, MAX, MIN. Bietet ein Beispiel für die Verwendung des GROUP BY-Operators zum Gruppieren in Datenauswahlabfragen. Beschreibt die Verwendung der HAVING-Klausel.

Berechnete Felder erstellen

Im Allgemeinen zum Erstellen berechnetes (abgeleitetes) Feld Die SELECT-Liste muss einen SQL-Ausdruck enthalten. Diese Ausdrücke nutzen die arithmetischen Operationen Addition, Subtraktion, Multiplikation und Division sowie integrierte SQL-Funktionen. Sie können den Namen einer beliebigen Spalte (Feld) einer Tabelle oder Abfrage angeben, verwenden jedoch nur den Spaltennamen der Tabelle oder Abfrage, der in der FROM-Klauselliste der entsprechenden Anweisung aufgeführt ist. Beim Erstellen komplexer Ausdrücke sind möglicherweise Klammern erforderlich.

Mit SQL-Standards können Sie die Namen der Spalten der resultierenden Tabelle, für die die AS-Klausel verwendet wird, explizit angeben.

SELECT Product.Name, Product.Price, Deal.Quantity, Product.Price*Deal.Quantity AS Cost FROM Product INNER JOIN Deal ON Product.ProductCode=Deal.ProductCode Beispiel 6.1.

Berechnung der Gesamtkosten für jede Transaktion. Beispiel 6.2.

Erhalten Sie eine Liste von Unternehmen mit den Namen und Initialen der Kunden. SELECT Company, Last Name+""+ Left(First Name,1)+"."+Left(Middle Name,1)+"."AS Full Name FROM Client

Beispiel 6.2.

Beispiel 6.3. Erhalten Sie eine Produktliste mit Angabe von Jahr und Monat des Verkaufs.

SELECT Product.Name, Year(Transaction.Date) AS Year, Month(Transaction.Date) AS Month FROM Product INNER JOIN Transaction ON Product.ProductCode=Transaction.ProductCode Beispiel 6.3.

Erhalt einer Produktliste mit Angabe von Jahr und Monat des Verkaufs.

Die Abfrage verwendet die integrierten Funktionen „Jahr“ und „Monat“, um das Jahr und den Monat aus einem Datum zu extrahieren.

Zusammenfassungsfunktionen verwenden Durch die Verwendung endgültige (Aggregat-)Funktionen

Innerhalb der SQL-Abfrage können Sie eine Reihe allgemeiner statistischer Informationen über die Menge der ausgewählten Werte der Ausgabemenge erhalten. Der Benutzer hat Zugriff auf die folgenden grundlegenden Funktionen:

  • Endfunktionen
  • Anzahl (Ausdruck) – bestimmt die Anzahl der Datensätze im Ausgabesatz der SQL-Abfrage;
  • Min/Max (Ausdruck) – Bestimmen Sie den kleinsten und größten Wert der Wertemenge in einem bestimmten Anforderungsfeld.
  • Avg (Ausdruck) – Mit dieser Funktion können Sie den Durchschnitt einer Reihe von Werten berechnen, die in einem bestimmten Feld von Datensätzen gespeichert sind, die durch eine Abfrage ausgewählt wurden. Es handelt sich um ein arithmetisches Mittel, d.h. die Summe der Werte geteilt durch ihre Anzahl.

Summe (Ausdruck) – Berechnet die Summe der Wertemenge, die in einem bestimmten Feld der von der Abfrage ausgewählten Datensätze enthalten ist.

Am häufigsten werden Spaltennamen als Ausdrücke verwendet. Der Ausdruck kann auch anhand der Werte mehrerer Tabellen berechnet werden.

Wenn Sie doppelte Werte entfernen müssen, bevor Sie eine generische Funktion verwenden, müssen Sie dem Spaltennamen in der Funktionsdefinition das Schlüsselwort DISTINCT voranstellen. Für die Funktionen MIN und MAX hat es keine Bedeutung, aber seine Verwendung kann sich auf die Ergebnisse der Funktionen SUM und AVG auswirken. Sie müssen daher überlegen, ob es in jedem Fall vorhanden sein sollte. Darüber hinaus kann das Schlüsselwort DISTINCT in jeder Abfrage nur einmal angegeben werden.

Es ist sehr wichtig, das zu beachten Der Benutzer hat Zugriff auf die folgenden grundlegenden Funktionen kann nur in einer Liste in einer SELECT-Klausel und als Teil einer HAVING-Klausel verwendet werden. In allen anderen Fällen ist dies nicht akzeptabel. Wenn die Liste in der SELECT-Klausel enthält Der Benutzer hat Zugriff auf die folgenden grundlegenden Funktionen und der Abfragetext nicht die GROUP BY-Klausel enthält, die das Zusammenfassen von Daten in Gruppen vorsieht, dann kann keines der Listenelemente der SELECT-Klausel Verweise auf Felder enthalten, außer in der Situation, in der die Felder als Argumente fungieren Endfunktionen.

Beispiel 6.4. Bestimmen Sie den ersten alphabetischen Namen des Produkts.

SELECT Min(Product.Name) AS Min_Name FROM Product Beispiel 6.4.

Ermittlung des ersten alphabetischen Namens des Produkts. Beispiel 6.5.

Bestimmen Sie die Anzahl der Transaktionen. SELECT Count(*) AS Number_of_deals FROM Deal

Beispiel 6.5. Bestimmen Sie die Anzahl der Transaktionen.

Beispiel 6.6. Bestimmen Sie die Gesamtmenge der verkauften Waren.

SELECT Sum(Deal.Quantity) AS Item_Quantity FROM Deal Beispiel 6.6.

Ermittlung der Gesamtmenge der verkauften Waren. Beispiel 6.7.

Bestimmen Sie den Durchschnittspreis der verkauften Waren. SELECT Avg(Product.Price) AS Avg_Price FROM Product INNER JOIN Deal ON Product.ProductCode=Deal.ProductCode;

Beispiel 6.7.

Abfragen erfordern häufig die Generierung von Zwischensummen, was normalerweise durch das Erscheinen des Ausdrucks „für jeden...“ in der Abfrage angezeigt wird. Zu diesem Zweck wird in der SELECT-Anweisung eine GROUP BY-Klausel verwendet. Eine Abfrage, die GROUP BY enthält, wird als Gruppierungsabfrage bezeichnet, da sie die von der SELECT-Operation zurückgegebenen Daten gruppiert und dann eine einzelne Zusammenfassungszeile für jede einzelne Gruppe erstellt. Der SQL-Standard verlangt, dass die SELECT-Klausel und die GROUP BY-Klausel eng miteinander verbunden sind. Wenn eine SELECT-Anweisung eine GROUP BY-Klausel enthält, muss jedes Listenelement in der SELECT-Klausel einen einzelnen Wert für die gesamte Gruppe haben. Darüber hinaus kann die SELECT-Klausel nur die folgenden Elementtypen enthalten: Feldnamen, Der Benutzer hat Zugriff auf die folgenden grundlegenden Funktionen, Konstanten und Ausdrücke, die Kombinationen der oben aufgeführten Elemente enthalten.

Alle in der SELECT-Klausel aufgeführten Feldnamen müssen auch in der GROUP BY-Klausel erscheinen – es sei denn, der Spaltenname wird in verwendet Endfunktion. Die umgekehrte Regel ist nicht wahr – die GROUP BY-Klausel kann Spaltennamen enthalten, die nicht in der Liste der SELECT-Klausel enthalten sind.

Wenn eine WHERE-Klausel in Verbindung mit GROUP BY verwendet wird, wird sie zuerst verarbeitet und nur die Zeilen, die die Suchbedingung erfüllen, werden gruppiert.

Der SQL-Standard legt fest, dass beim Gruppieren alle fehlenden Werte gleich behandelt werden. Wenn zwei Tabellenzeilen in derselben Gruppierungsspalte einen NULL-Wert und identische Werte in allen anderen Gruppierungsspalten ungleich Null enthalten, werden sie in dieselbe Gruppe eingeordnet.

Beispiel 6.9. Berechnen Sie das durchschnittliche Einkaufsvolumen jedes Kunden.

SELECT Client.LastName, Avg(Transaction.Quantity) AS Average_Quantity FROM Client INNER JOIN Trade ON Client.ClientCode=Transaction.ClientCode GROUP BY Client.LastName Beispiel 6.9.

Berechnen Sie das durchschnittliche Einkaufsvolumen jedes Kunden. Die Formulierung „jeder Kunde“ spiegelt sich in der SQL-Abfrage in Form eines Satzes wider.

GROUP BY Client.LastName Beispiel 6.10.

Bestimmen Sie, für wie viel jedes Produkt verkauft wurde. SELECT Product.Name, Sum(Product.Price*Transaction.Quantity) AS Cost FROM Product INNER JOIN Deal ON Product.ProductCode=Transaction.ProductCode GROUP BY Product.Name

SELECT Client.Company, Count(Transaction.TransactionCode) AS Number_of_transactions FROM Client INNER JOIN Transaction ON Client.ClientCode=Transaction.ClientCode GROUP BY Client.Company Beispiel 6.11.

Zählen der Anzahl der von jedem Unternehmen durchgeführten Transaktionen. SELECT Customer.Company, Sum(Transaction.Quantity) AS Total_Quantity, Sum(Product.Price*Transaction.Quantity) AS Cost FROM Product INNER JOIN (Customer INNER JOIN Transaction ON Customer.ClientCode=Transaction.CustomerCode) ON Product.ProductCode=Transaction .Produktcode GRUPPE NACH Kunde.Unternehmen

Beispiel 6.12. Berechnung der Gesamtmenge der für jedes Unternehmen gekauften Waren und ihrer Kosten.

Beispiel 6.13. Bestimmen Sie die Gesamtkosten jedes Produkts für jeden Monat.

SELECT Product.Name, Month(Transaction.Date) AS Month, Sum(Product.Price*Transaction.Quantity) AS Cost FROM Product INNER JOIN Transaction ON Product.ProductCode=Transaction.ProductCode GROUP BY Product.Name, Month(Transaction.Date ) Beispiel 6.13.

Ermittlung der Gesamtkosten jedes Produkts für jeden Monat. Beispiel 6.14.

Bestimmen Sie die Gesamtkosten jedes erstklassigen Produkts für jeden Monat.

SELECT Product.Name, Month(Transaction.Date) AS Month, Sum(Product.Price*Transaction.Quantity) AS Cost FROM Product INNER JOIN Transaction ON Product.ProductCode=Transaction.ProductCode WHERE Product.Grade="First" GROUP BY Product .Name, Monat (Transaktionsdatum)

Beispiel 6.14.

  • Ermittlung der Gesamtkosten jedes erstklassigen Produkts für jeden Monat.
  • HABEN Angebot
  • Mit HAVING werden alle zuvor mit GROUP BY gruppierten Datenblöcke reflektiert, die die in HAVING angegebenen Bedingungen erfüllen. Dies ist eine zusätzliche Option zum „Filtern“ des Ausgabesatzes.

Die Bedingungen in HAVING unterscheiden sich von den Bedingungen in WHERE: HAVING schließt Gruppen mit aggregierten Wertergebnissen aus dem resultierenden Datensatz aus;

WHERE schließt Datensätze, die die Bedingung nicht erfüllen, von der Berechnung der Aggregatwerte durch Gruppierung aus; Aggregatfunktionen können in der WHERE-Suchbedingung nicht angegeben werden.

Beispiel 6.15. Identifizieren Sie Unternehmen, deren Gesamtzahl an Transaktionen drei übersteigt.

SELECT Product.Name, Sum(Product.Price*Deal.Quantity) AS Cost FROM Product INNER JOIN Deal ON Product.ProductCode=Transaction.ProductCode GROUP BY Product.Name HAVING Sum(Product.Price*Deal.Quantity)>10000 Beispiel 6.16.

Anzeige einer Liste von Waren, die für mehr als 10.000 Rubel verkauft wurden. Beispiel 6.17.

Zeigen Sie eine Liste der Produkte an, die für mehr als 10.000 verkauft wurden, ohne den Betrag anzugeben. SELECT Product.Name FROM Product INNER JOIN Deal ON Product.ProductCode=Deal.ProductCode GROUP BY Product.Name HAVING Sum(Product.Price*Transaction.Quantity)>10000

Beispiel 6.17. Zeigen Sie eine Liste der Produkte an, die für mehr als 10.000 verkauft wurden, ohne den Betrag anzugeben. In diesem Tutorial erfahren Sie, wie Sie es verwenden

COUNT-Funktion

in SQL Server (Transact-SQL) mit Syntax und Beispielen. Beschreibung In SQL Server (Transact-SQL)

COUNT-Funktion

gibt die Anzahl der Zeilen eines Feldes oder Ausdrucks im Ergebnissatz zurück.

Syntax

Die Syntax für die COUNT-Funktion in SQL Server (Transact-SQL) lautet:

ODER die Syntax für die COUNT-Funktion beim Gruppieren der Ergebnisse einer oder mehrerer Spalten lautet:
Parameter oder Argumente
Ausdruck1, Ausdruck2, … Ausdruck_n
Ausdrücke, die nicht in einer COUNT-Funktion eingeschlossen sind und in einer GROUP BY-Klausel am Ende der SQL-Anweisung enthalten sein müssen.
aggregat_expression ist die Spalte oder der Ausdruck, deren Nicht-NULL-Werte gezählt werden.

Tabellen – Tabellen, aus denen Sie Datensätze abrufen möchten. In der FROM-Klausel muss mindestens eine Tabelle aufgeführt sein.

WHERE-Bedingungen – optional. Dies sind Bedingungen, die für die ausgewählten Datensätze erfüllt sein müssen.

Einschließlich Nicht-NULL-Werte

Nicht jeder versteht das, aber die COUNT-Funktion zählt nur die Datensätze, bei denen der Wert des Ausdrucks in COUNT (aggregate_expression) nicht NULL ist. Wenn ein Ausdruck einen NULL-Wert enthält, wird er nicht im COUNT-Zähler berücksichtigt.

Schauen wir uns ein Beispiel der COUNT-Funktion an, das zeigt, wie NULL-Werte von der COUNT-Funktion ausgewertet werden.

Wenn Sie beispielsweise die folgende Tabelle mit dem Namen „Märkte“ haben:

Dieses COUNT-Beispiel gibt 3 zurück, da alle Market_id-Werte im Abfrageergebnissatz NICHT NULL sind.

Wenn Sie jedoch die folgende SELECT-Anweisung ausgeführt haben, die die COUNT-Funktion verwendet:

Transact-SQL

Wählen Sie die Anzahl (Mitglieder) aus den Märkten aus. --Ergebnis: 1

Die COUNT-Funktion kann in den folgenden Versionen von SQL Server (Transact-SQL) verwendet werden:
SQL Server vNext, SQL Server 2016, SQL Server 2015, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005

Beispiel mit einem Feld

Schauen wir uns einige Beispiele für die COUNT-Funktion von SQL Server an, um zu verstehen, wie die COUNT-Funktion in SQL Server (Transact-SQL) verwendet wird.

So können Sie beispielsweise herausfinden, wie viele Kontakte ein Benutzer mit last_name = „Rasputin“ hat.

In diesem Beispiel der COUNT-Funktion haben wir den Alias ​​„Anzahl der Kontakte“ für den COUNT (*)-Ausdruck angegeben. Daher wird in der Ergebnismenge „Anzahl der Kontakte“ als Feldname angezeigt.

Beispiel mit DISTINCT

Sie können den DISTINCT-Operator in der COUNT-Funktion verwenden. Die folgende SQL-Anweisung gibt beispielsweise die Anzahl der eindeutigen Abteilungen zurück, in denen mindestens ein Mitarbeiter den Vornamen = „Samvel“ hat.