Select query met group by en having
Ik ben met een select query bezig om gegevens uit mijn database te halen alleen ik krijg maar niet de juiste informatie eruit. Ik heb een database met een date veld erin en ik heb een kolom cijfers en daarin staat dan 0, 1, 2 maar het er kan ook 100000 staan enz. (zie onderstaande afbeelding van een voorbeeld van de gegevens uit mijn database).
Nu wil ik twee queries maken een die alle gegevens eruit haalt van alle jaren waarvan de cijfers bestaat uit 1 of 2 getallen, die krijg ik werkend (al weet ik niet 100% zeker of het goed is). En ik wil een query die alle gegevens eruit haal van een specifiek jaar waarvan de cijfers bestaat uit 1 of 2 getallen, en die krijg ik niet werken.
Query die alle gegevens eruit haal van elk jaar (deze laat de juiste aantallen zien)
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT cijfers,
CHAR_LENGTH(cijfers) As cijferscount,
count(*) as aantal
FROM tabelnaam
Group by cijfers
HAVING cijferscount = 1 OR cijferscount = 2
CHAR_LENGTH(cijfers) As cijferscount,
count(*) as aantal
FROM tabelnaam
Group by cijfers
HAVING cijferscount = 1 OR cijferscount = 2
En uiteindelijk krijg ik dan de resultaten a la de toegevoegde afbeelding hierboven (b.v. 6x komt de 0 voor, 3x in 2008 en 3x in 2009)
En dit is de query die ik er dan van gemaakt heb om de resultaten van een specifiek jaar op te halen:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT YEAR(datum) As jaar,
cijfers,
CHAR_LENGTH(cijfers) As cijferscount,
count(*) as aantal
FROM tabelnaam
Group by cijfers
HAVING cijferscount = 1 OR cijferscount = 2 AND jaar = "2008"
cijfers,
CHAR_LENGTH(cijfers) As cijferscount,
count(*) as aantal
FROM tabelnaam
Group by cijfers
HAVING cijferscount = 1 OR cijferscount = 2 AND jaar = "2008"
Alleen wat er nu fout gaat is dat hij aangeeft van in 2008 komt het nummer 0, 6x voor terwijl dat maar 3x is in 2008 (en ook 3x in 2009, dus totaal is het wel 6 maar ik wil alleen de aantallen van 2008 weten).
Wat doe ik fout?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT YEAR(datum) As jaar,
cijfers,
CHAR_LENGTH(cijfers) As cijferscount,
count(*) as aantal
FROM getallen
GROUP BY jaar, cijfers
HAVING ( cijferscount = 1 OR cijferscount = 2 ) AND jaar = "2008";
cijfers,
CHAR_LENGTH(cijfers) As cijferscount,
count(*) as aantal
FROM getallen
GROUP BY jaar, cijfers
HAVING ( cijferscount = 1 OR cijferscount = 2 ) AND jaar = "2008";
Toevoeging op 08/05/2021 20:05:20:
PS. Een getal bestaat uit cijfers, niet andersom.
Ik ga even in de group by duiken, bedankt voor de verbetering van de query.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT YEAR(datum) As jaar,
cijfers,
-- CHAR_LENGTH(cijfers) As cijferscount,
count(*) as aantal
FROM getallen
WHERE CHAR_LENGTH(cijfers) < 3
AND jaar = "2008"
GROUP BY jaar, cijfers
cijfers,
-- CHAR_LENGTH(cijfers) As cijferscount,
count(*) as aantal
FROM getallen
WHERE CHAR_LENGTH(cijfers) < 3
AND jaar = "2008"
GROUP BY jaar, cijfers
Ik heb cijfercount ook even uitgecommenteerd: die moet anders namelijk ook in het stuk group-by staan, maar dan krijg je per cijfercount (1, 5, 32 etc) ook weer een count() bepaald.
Toevoeging op 11/05/2021 16:43:23:
aanvullend: having zou je nodig hebben als je bijvoorbeeld alleen die resultaten wilt hebben die "aantal" groter dan zeg 10 hebben:
GROUP BY jaar, cijfers
HAVING COUNT(*) > 10
Gewijzigd op 11/05/2021 15:44:33 door Ivo P