[RESOLU] sommes sur un meme champs??

sommes sur un meme champs?? [RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 16-01-2006 à 18:03:39    

Salut salut,  :hello:  
 
J'ai un gros probleme de requete, je vais vous montrer par l'exemple ca ira plus vite.
Ma table contient
 
date             montant       type
01/01/05        1000           credit
02/01/05        500           credit
02/01/05        200           debit
01/01/05        2000           debit
01/01/05        3000           debit
01/01/05        12           credit
02/01/05        12           credit
 
et je cherche une requete qui me retourne ca:
date             credit        debit
01/01/05         1012       5000
02/01/05         512          200
 
mais je suis incapable de soritr la requete sql
 
Merci de votre aide


Message édité par bob_eponge le 16-01-2006 à 22:50:19
Reply

Marsh Posté le 16-01-2006 à 18:03:39   

Reply

Marsh Posté le 16-01-2006 à 19:36:13    

SELECT date, type, sum(montant)
FROM tatable
GROUP BY date, type
 
ça te donnera
01/01/05 credit 1012
01/01/05 debit 5000
02/01/05 credit 512
02/01/05 debit 200
 
en quatre ligne. ça peut pas faire l'affaire, car sinon la requete deviendra compliqué pour avoir une colonne débit et une colonne crédit :D

Reply

Marsh Posté le 16-01-2006 à 20:49:00    

merci mais ca ne me va pas.
Je veux (enfin j'ai besoin de) la requete compliquée ;-)

Reply

Marsh Posté le 16-01-2006 à 21:32:23    

Oracle ? MySql ? SQL Server ?
 
Pour Oracle :
 

Code :
  1. SELECT date,
  2.        SUM(DECODE(type, 'credit', montant, 0)) as credit_total,
  3.        SUM(DECODE(type, 'debit', montant, 0)) as debit_total
  4. FROM tatable
  5. GROUP BY date;


 
Il y a des équivalents pour les autres SGBD (regarde du côté de CASE).

Reply

Marsh Posté le 16-01-2006 à 21:48:28    

ok merci ca marche pour oracle
mais il n'y a rien qui permettrait de le faire en pure SQL, sans utiliser les option de tel ou tel sgbd??

Reply

Marsh Posté le 16-01-2006 à 21:54:54    

pourquoi ca ca ne marche pas :

Code :
  1. select a.date,a.credit,b.debit
  2. (select date,sum(montant) as credit from test where type='credit' group by date) a
  3. left outer join
  4. (select date,sum(t.montant) as debit from test where type='debit' group by date) b
  5. on a.date=b.date

Reply

Marsh Posté le 16-01-2006 à 21:56:42    

Une jointure externe simple ne marche pas, car tu ne va pas pouvoir prendre en compte certains jours où un seul le montant est non nul (d'un type seulement).
Il faut faire une jointure externe double, FULL OUTER JOIN (plus ou moins supporté).

Reply

Marsh Posté le 16-01-2006 à 21:58:30    

ok mais ca change rien,
mysql me dit que j'ai une erreur de syntaxe

Reply

Marsh Posté le 16-01-2006 à 22:00:53    

j'ai essayé avec la jointure classique

Code :
  1. select a.y1,a.s1,b.s2 from (select year(date) as y1,sum(montant) as s1 from test where type='credit' group by year(date))a ,
  2. (select year(date) as y2,sum(montant) as s2 from test where type='debit' group by year(date))b
  3. where y1=y2


 
et la ca marche bien, mais comme tu me l'a précisé, ca ne marche que si j'ai un element credit et debit pour chaque ligne.
(dans cette requete j'ai regroupé par année mais ca ne change pa le princie)


Message édité par bob_eponge le 16-01-2006 à 22:01:21
Reply

Marsh Posté le 16-01-2006 à 22:49:44    

il suffit d'utiliser la fonction case qui est du pure SQL et qui fait a peu pres comme la fonction decode de oracle

Reply

Sujets relatifs:

Leave a Replay

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