Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1528 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL4] Requête group by

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL4] Requête group by

n°922831
seb666
Posté le 14-12-2004 à 15:00:21  profilanswer
 

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 :)

mood
Publicité
Posté le 14-12-2004 à 15:00:21  profilanswer
 

n°922869
Beegee
Posté le 14-12-2004 à 15:21:44  profilanswer
 

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.

n°922904
seb666
Posté le 14-12-2004 à 15:33:20  profilanswer
 

- 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
n°923101
Beegee
Posté le 14-12-2004 à 17:37:51  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL4] Requête group by

 

Sujets relatifs
Problème de renvoi d'une requète ms query dans Excel[VBA-SQL] Requete entre une table SQL Server et une table Access
Requete Myql + PB sécuritéRequête Oracle avec Tomcat
Requête MySQL et création de Menuscomplémentaire de résultat d'une requète
aidez une pauvre etudiante avec une requete bloquantepetite aide SQL requete imbriqué
[Résolu] Exploiter 2 fois un résultat d'une requêteproblème de syntaxe avec une requête SQL
Plus de sujets relatifs à : [MySQL4] Requête group by


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR