Group by voorbeelden

COUNT(column)
Aggegrate functies berekenen alleen over niet lege velden. Met COUNT() is het dus belangrijk welke kolom je opgeeft.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT
    c.cat_name,
    COUNT(c.cat_id) AS aantal
FROM
    categories AS c
LEFT JOIN
    products AS p
    ON c.cat_id = p.cat_id
GROUP BY c.cat_name;

-- of

SELECT
    c.cat_name,
    COUNT(p.cat_id) AS aantal
FROM
    categories AS c
LEFT JOIN
    products AS p
    ON c.cat_id = p.cat_id
GROUP BY c.cat_name;

Als een categorie geen producten bevat, zal in de eerste query aantal toch 1 zijn, en in de tweede 0 (zoals het hoort).

Group by met aggegrate functies wordt vaak gebruikt voor het maken van rapportages.
Er zijn diverse mogelijkheden en variaties, een paar voorbeelden:

De omzet van producten van het afgelopen jaar:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    p.product_name,
    p.product_id,
    SUM(op.amount) AS total_amount,
    SUM(op.amount * op.price_pp) AS sales_volume
FROM
    products AS p  
LEFT JOIN
    (
    order_products op
    INNER JOIN
        orders o
        ON o.order_id = op.order_id
        AND EXTRACT(YEAR FROM o.order_date) = EXTRACT(YEAR FROM CURRENT_DATE())  1
    )
    ON p.product_id = op.product_id
GROUP BY
    p.product_name, p.product_id

Kijk of er producten zijn die niet of nauwelijks verkocht worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    p.product_name AS trash_candidate,
    p.product_id,
    SUM(op.amount) AS total_amount,
FROM
    products AS p  
LEFT JOIN
    (
    order_products op
    INNER JOIN
        orders o
        ON o.order_id = op.order_id
        AND EXTRACT(YEAR FROM o.order_date) = EXTRACT(YEAR FROM CURRENT_DATE())
    )
    ON p.product_id = op.product_id
GROUP BY
    trash_candidate, p.product_id
HAVING SUM(op.amount) < 10

De omzet van producten per maand:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
    EXTRACT(MONTH FROM o.order_date) AS amonth
    p.product_name,
    p.product_id,
    SUM(op.amount) AS total_amount,
    SUM(op.amount * op.price_pp) AS sales_volume
FROM
    products AS p  
LEFT JOIN
    (
    order_products op
    INNER JOIN
        orders o
        ON o.order_id = op.order_id
        AND EXTRACT(YEAR FROM o.order_date) = EXTRACT(YEAR FROM CURRENT_DATE())
    )
    ON p.product_id = op.product_id
GROUP BY
    amonth, p.product_name, p.product_id

Er kan overal op gegroepeerd worden, gedeeltes van kolommen, resultaten van functies etc. als het maar in de selectlist voorkomt. In het volgende hoofdstuk volgt nog een voorbeeld met een group by op een range.

« Lees de omschrijving en reacties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.