[MySQL4] Requête group by

Requête group by [MySQL4] - SQL/NoSQL - Programmation

Marsh Posté le 14-12-2004 à 15:00:21    

Bonjour :)
 
J'ai un pb sur une requete group by.
 
Dans ma base,
1 "band" a n "booking"
1 "booking" a n "payment"
 
Je cherche a calculer l'encours pour chaque groupe (band). Le problème, c'est que si il y a plusieur "payment" pour un "booking" alors la somme pour BOK_AMNT est forcement fausse (* par le nombre de paiements).
Je ne vois pas comment contourner le pb. Voici la requete :
 
select BND_ID, (sum(BOK_AMNT) - coalesce(sum(PAY_AMNT), 0)) as BALANCE
from BOOKING
inner join BAND on BOK_BND_ID = BND_ID
left join PAYMENT on BOK_PCL_ID = PAY_PCL_ID
where BOK_TYPE = 1
and BOK_DATE < '2004-13-12'
group by BND_ID
having BALANCE > 0
 
Merci de votre aide :)

Reply

Marsh Posté le 14-12-2004 à 15:00:21   

Reply

Marsh Posté le 14-12-2004 à 15:21:44    

Pour faire simple, si on enlève les restrictions que tu as ajoutées, on a :
 

Code :
  1. SELECT BND_ID,
  2.        SUM(BOK_AMNT) - SUM(PAY_AMNT) AS BALANCE
  3. FROM BOOKING
  4. INNER JOIN BAND ON BOK_BND_ID = BND_ID
  5. LEFT JOIN PAYMENT ON BOK_PCL_ID = PAY_PCL_ID
  6. GROUP BY BND_ID;


 
La fonction COALESCE fait quoi exactement ? la mise à 0 si NULL ?
 
Je comprends pas vraiment pourquoi tu dis que :
"si il y a plusieur "payment" pour un "booking" alors la somme pour BOK_AMNT est forcement fausse (* par le nombre de paiements)."
 
Donne des exemples de données montrant le problème.

Reply

Marsh Posté le 14-12-2004 à 15:33:20    

- Le coalesce permet ne ne pas sommer la valeur null si la jointure (left join) ne se fait pas. Sinon cela a pour effet de me faire une somme = a nulle.
Je me suis planter en reecrivant la requete, c'est en fait sum(coalesce(PAY_AMNT, 0))  
 
- Mom probleme est lie a la necessite de regrouper par BND_ID
Exemple sans le group by :
 
BND_ID    BOK_AMNT    PAY_AMNT
1         20          10
1         20          20
1         30          15  
 
Comme j'ai 2 paiments, le left join va dedoubler la ligne
La somme des BOK_AMNT est donc 2*20 au lieu de 20 donc un montant de 70 au lieu de 50


Message édité par seb666 le 14-12-2004 à 15:50:39
Reply

Marsh Posté le 14-12-2004 à 17:37:51    

Tu peux faire qqch comme :
 

Code :
  1. SELECT BAND.BND_ID,
  2.        SUM(BOK2.BOK_AMNT) - SUM(COALESCE(PAYMENT.PAY_AMNT,0)) AS BALANCE
  3. FROM BAND
  4. INNER JOIN BOOKING BOK1 ON BOK1.BOK_BND_ID = BAND.BND_ID
  5. INNER JOIN BOOKING BOK2 ON BOK2.BOK_BND_ID = BAND.BND_ID
  6. LEFT JOIN PAYMENT ON BOK1.BOK_PCL_ID = PAYMENT.PAY_PCL_ID
  7. GROUP BY BND_ID;


 
En gros, pour ne pas sommer plusieurs fois les même montants de BOOKING, tu utilises une autre jointure sur cette table (BOK2).
Pour la syntaxe y a peut-être des erreurs, ça fait qq temps que j'ai pas touché à mySql :D


Message édité par Beegee le 14-12-2004 à 17:38:11
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed