Groep gebruiken door op meerdere kolommen

Ik begrijp het punt van GROUP BY x.

Maar hoe werkt GROUP BY x, ywerk, en wat betekent het?


Antwoord 1, Autoriteit 100%

Group By XMiddelen Zet al die met dezelfde waarde voor x in de ene groep .

Group By X, YBETREKKING Zet al die met dezelfde waarden voor zowel X als Y in de One Group .

Om te illustreren met behulp van een voorbeeld, laten we zeggen dat we de volgende tabel hebben, te maken met wie bijwonen welk onderwerp op een universiteit is:

Table: Subject_Selection
+---------+----------+----------+
| Subject | Semester | Attendee |
+---------+----------+----------+
| ITB001  |        1 | John     |
| ITB001  |        1 | Bob      |
| ITB001  |        1 | Mickey   |
| ITB001  |        2 | Jenny    |
| ITB001  |        2 | James    |
| MKB114  |        1 | John     |
| MKB114  |        1 | Erica    |
+---------+----------+----------+

Wanneer u alleen een GROUP BYop de kolom Onderwerp; Zeg:

select Subject, Count(*)
from Subject_Selection
group by Subject

je krijgt zoiets:

+---------+-------+
| Subject | Count |
+---------+-------+
| ITB001  |     5 |
| MKB114  |     2 |
+---------+-------+

… omdat er 5 inzendingen zijn voor ITB001, en 2 voor MKB114

Als we naar GROUP BYtwee kolommen:

select Subject, Semester, Count(*)
from Subject_Selection
group by Subject, Semester

We zouden dit krijgen:

+---------+----------+-------+
| Subject | Semester | Count |
+---------+----------+-------+
| ITB001  |        1 |     3 |
| ITB001  |        2 |     2 |
| MKB114  |        1 |     2 |
+---------+----------+-------+

Dit komt omdat, wanneer we groeperen op twee kolommen, er wordt gezegd “Groepeer ze zo dat al diegenen met hetzelfde onderwerp en semester in dezelfde groep zitten, en bereken dan alle geaggregeerde functies(Aantal, Som, Gemiddelde, etc.) voor elk van die groepen”. In dit voorbeeld wordt dit aangetoond door het feit dat, als we ze tellen, er driemensen zijn die ITB001 doen in semester 1 en tweehet doen in semester 2. Beiden van de mensen die MKB114 doen zit in semester 1, dus er is geen rij voor semester 2 (geen gegevens passen in de groep “MKB114, Semester 2”)

Hopelijk is dat logisch.


Antwoord 2, autoriteit 2%

Hier ga ik niet alleen het gebruik van de GROUP-clausule uitleggen, maar ook het gebruik van de aggregatiefuncties.

De GROUP BY-clausule wordt gebruikt in combinatie met de aggregatiefuncties om de resultaatset te groeperen op een of meer kolommen. bijv.:

-- GROUP BY with one parameter:
SELECT column_name, AGGREGATE_FUNCTION(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
-- GROUP BY with two parameters:
SELECT
    column_name1,
    column_name2,
    AGGREGATE_FUNCTION(column_name3)
FROM
    table_name
GROUP BY
    column_name1,
    column_name2;

Onthoud deze bestelling:

  1. SELECT (wordt gebruikt om gegevens uit een database te selecteren)

  2. FROM (clausule wordt gebruikt om de tabellen weer te geven)

  3. WAAR (clausule wordt gebruikt om records te filteren)

  4. GROUP BY (clausule kan worden gebruikt in een SELECT-instructie om gegevens te verzamelen)
    over meerdere records en groepeer de resultaten op een of meer kolommen)

  5. HAVING (clausule wordt gebruikt in combinatie met de GROUP BY-clausule om)
    beperk de groepen met geretourneerde rijen tot alleen die waarvan de voorwaarde
    is WAAR)

  6. ORDER BY (sleutelwoord wordt gebruikt om de resultatenset te sorteren)

U kunt deze allemaal gebruiken als u gebruikmaakt van aggregatiefuncties, en dit is de volgorde waarin ze moeten worden ingesteld, anders kunt u een foutmelding krijgen.

Totale functies zijn:

MIN() geeft de kleinste waarde in een bepaalde kolom terug

MAX() retourneert de maximale waarde in een bepaalde kolom.

SUM() geeft de som van de numerieke waarden in een bepaalde kolom terug

AVG() retourneert de gemiddelde waarde van een bepaalde kolom

COUNT() retourneert het totale aantal waarden in een bepaalde kolom

COUNT(*) geeft het aantal rijen in een tabel terug

SQL-scriptvoorbeelden over het gebruik van aggregatiefuncties:

Stel dat we de verkooporders moeten vinden waarvan de totale verkoop groter is dan $ 950. We combineren de HAVING-clausule en de GROUP BY-clausule om dit te bereiken:

SELECT 
    orderId, SUM(unitPrice * qty) Total
FROM
    OrderDetails
GROUP BY orderId
HAVING Total > 950;

Alle bestellingen tellen en ze klant-ID groeperen en het resultaat oplopend sorteren. We combineren de functie COUNTen de clausules GROUP BY, ORDER BYen ASC:

SELECT 
    customerId, COUNT(*)
FROM
    Orders
GROUP BY customerId
ORDER BY COUNT(*) ASC;

Haal de categorie op met een gemiddelde eenheidsprijs van meer dan $ 10, gebruik de functie AVGin combinatie met de clausules GROUP BYen HAVING:

SELECT 
    categoryName, AVG(unitPrice)
FROM
    Products p
INNER JOIN
    Categories c ON c.categoryId = p.categoryId
GROUP BY categoryName
HAVING AVG(unitPrice) > 10;

Het goedkoopste product per categorie verkrijgen, met behulp van de functie MINin een subquery:

SELECT categoryId,
       productId,
       productName,
       unitPrice
FROM Products p1
WHERE unitPrice = (
                SELECT MIN(unitPrice)
                FROM Products p2
                WHERE p2.categoryId = p1.categoryId)

De volgende instructie groepeert rijen met dezelfde waarden in de kolommen categoryIden productId:

SELECT 
    categoryId, categoryName, productId, SUM(unitPrice)
FROM
    Products p
INNER JOIN
    Categories c ON c.categoryId = p.categoryId
GROUP BY categoryId, productId

Antwoord 3

In eenvoudig Engels van GROUP BYmet twee parameters, wat we doen is op zoek naar vergelijkbare waardeparen en de telling naar een 3e kolom brengen.

Bekijk het volgende voorbeeld ter referentie. Hier gebruik ik Internationale voetbalresultaten van 1872 tot 2020

+----------+----------------+--------+---+---+--------+---------+-------------------+-----+
|       _c0|             _c1|     _c2|_c3|_c4|     _c5|      _c6|                _c7|  _c8|
+----------+----------------+--------+---+---+--------+---------+-------------------+-----+
|1872-11-30|        Scotland| England|  0|  0|Friendly|  Glasgow|           Scotland|FALSE|
|1873-03-08|         England|Scotland|  4|  2|Friendly|   London|            England|FALSE|
|1874-03-07|        Scotland| England|  2|  1|Friendly|  Glasgow|           Scotland|FALSE|
|1875-03-06|         England|Scotland|  2|  2|Friendly|   London|            England|FALSE|
|1876-03-04|        Scotland| England|  3|  0|Friendly|  Glasgow|           Scotland|FALSE|
|1876-03-25|        Scotland|   Wales|  4|  0|Friendly|  Glasgow|           Scotland|FALSE|
|1877-03-03|         England|Scotland|  1|  3|Friendly|   London|            England|FALSE|
|1877-03-05|           Wales|Scotland|  0|  2|Friendly|  Wrexham|              Wales|FALSE|
|1878-03-02|        Scotland| England|  7|  2|Friendly|  Glasgow|           Scotland|FALSE|
|1878-03-23|        Scotland|   Wales|  9|  0|Friendly|  Glasgow|           Scotland|FALSE|
|1879-01-18|         England|   Wales|  2|  1|Friendly|   London|            England|FALSE|
|1879-04-05|         England|Scotland|  5|  4|Friendly|   London|            England|FALSE|
|1879-04-07|           Wales|Scotland|  0|  3|Friendly|  Wrexham|              Wales|FALSE|
|1880-03-13|        Scotland| England|  5|  4|Friendly|  Glasgow|           Scotland|FALSE|
|1880-03-15|           Wales| England|  2|  3|Friendly|  Wrexham|              Wales|FALSE|
|1880-03-27|        Scotland|   Wales|  5|  1|Friendly|  Glasgow|           Scotland|FALSE|
|1881-02-26|         England|   Wales|  0|  1|Friendly|Blackburn|            England|FALSE|
|1881-03-12|         England|Scotland|  1|  6|Friendly|   London|            England|FALSE|
|1881-03-14|           Wales|Scotland|  1|  5|Friendly|  Wrexham|              Wales|FALSE|
|1882-02-18|Northern Ireland| England|  0| 13|Friendly|  Belfast|Republic of Ireland|FALSE|
+----------+----------------+--------+---+---+--------+---------+-------------------+-----+

En nu ga ik groeperen op soortgelijk land (kolom _c7) en toernooi(_c5) waardeparen volgens GROUP BYbewerking ,

SELECT `_c5`,`_c7`,count(*)  FROM res GROUP BY `_c5`,`_c7`
+--------------------+-------------------+--------+
|                 _c5|                _c7|count(1)|
+--------------------+-------------------+--------+
|            Friendly|  Southern Rhodesia|      11|
|            Friendly|            Ecuador|      68|
|African Cup of Na...|           Ethiopia|      41|
|Gold Cup qualific...|Trinidad and Tobago|       9|
|AFC Asian Cup qua...|             Bhutan|       7|
|African Nations C...|              Gabon|       2|
|            Friendly|           China PR|     170|
|FIFA World Cup qu...|             Israel|      59|
|FIFA World Cup qu...|              Japan|      61|
|UEFA Euro qualifi...|            Romania|      62|
|AFC Asian Cup qua...|              Macau|       9|
|            Friendly|        South Sudan|       1|
|CONCACAF Nations ...|           Suriname|       3|
|         Copa Newton|          Argentina|      12|
|            Friendly|        Philippines|      38|
|FIFA World Cup qu...|              Chile|      68|
|African Cup of Na...|         Madagascar|      29|
|FIFA World Cup qu...|       Burkina Faso|      30|
| UEFA Nations League|            Denmark|       4|
|        Atlantic Cup|           Paraguay|       2|
+--------------------+-------------------+--------+

Uitleg:de betekenis van de eerste rij is dat er in totaal 11 vriendschappelijke toernooien zijn gehouden op Zuid-Rhodesië.

Opmerking:hier is het in dit geval verplicht om een tellerkolom te gebruiken.

Other episodes