[SQL] COUNT() op meerdere tabellen

Pagina: 1
Acties:
  • 135 views sinds 30-01-2008
  • Reageer

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
De volgende query
SQL:
1
2
3
4
5
6
7
8
SELECT
  a.titel AS artikel,
  COUNT(DISTINCT al.leverancier_id) AS leverancier_aantal,
  COUNT(DISTINCT am.maand_id) AS maand_aantal
FROM artikel a
  LEFT JOIN artikel_maand am ON (a.id = am.artikel_id)
  LEFT JOIN artikel_leverancier al ON (a.id = al.artikel_id)
GROUP BY a.id

geeft de resultaten die ik wil:

artikelleverancier_aantalmaand_aantal
Banaan25
Appel24
Bloemkool25
Prei22
Gehaktbal20
Koffie10

De query die ik in eerste instantie logisch vond, zonder de DISTINCT in de COUNT (2x) niet:

artikelleverancier_aantalmaand_aantal
Banaan1010
Appel88
Bloemkool1010
Prei44
Gehaktbal20
Koffie10


Ik vind het ook vreemd dat de waarden vermenigvuldigd (in plaats van opgeteld) worden en in beide kolommen staan. Maar mijn vraag is vooral: is mijn eerste query wel de juiste manier om zo'n GROUP BY uit te voeren?

Hopelijk lever ik genoeg informatie, anders leg ik het natuurlijk graag nog uitgebreider uit :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-04 22:58

Janoz

Moderator Devschuur®

!litemod

Count telt niet het aantal waarden, maar het aantal records. Wanneer je de groupby en de count weg zou halen zouden "banaan" 10 keer voorkomen. Vijf maanden met leverancier a en vijf maanden met leverancier b. Door de count en de group by toe te voegen worden die 10 records samen gevoegd (ze hebben immers hetzelfde a.id) en telt de count dus 10.

Je query is trouwens nog steeds niet goed. In de group by hoor je alle kolommen zonder agregate function op te nemen. id komt niet eens voor in je select. Je hoort te groupen op a.titel.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Topicstarter
Helemaal duidelijk, bedankt voor de uitleg! :)