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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
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.
« vorige pagina | volgende pagina »
Inhoudsopgave
- Inleiding
- Joins algemeen
- Inner en outer join
- Cross en natural join
- Joins in de praktijk (1)
- Subqueries
- Joins in de praktijk (2)
- Group by
- Group by voorbeelden
- Conditional staments
- Nog meer voorbeelden
- Nawoord