Simplification de requête

Simplification de requête - SQL/NoSQL - Programmation

Marsh Posté le 04-09-2009 à 13:54:59    

Bonjour,
 
voici un requête faites sous Access :
 

Citation :

SELECT employe, Date,  
(SELECT Sum(ValeurCalculee) FROM StatCalc a WHERE ID_Cpt In (9,12) AND a.Employe = s.employe  AND a.Date = s.Date ) AS Cpt1,  
(SELECT ValeurCalculee FROM StatCalc b WHERE ID_Cpt =10 AND b.Employe = s.employe  AND b.Date = s.Date ) AS Cpt2,  
(SELECT ValeurCalculee FROM StatCalc c WHERE ID_Cpt =11 AND c.Employe = s.employe AND c.Date = s.Date  ) AS Cpt3,
(SELECT ValeurCalculee FROM StatCalc d WHERE ID_Cpt =7 AND d.Employe = s.employe AND d.Date = s.Date ) AS Cpt4,  
(SELECT ValeurCalculee FROM StatCalc e WHERE ID_Cpt =51 AND e.Employe = s.employe  AND e.Date = s.Date ) AS Cpt5,
(SELECT ValeurCalculee FROM StatCalc f WHERE ID_Cpt =46 AND f.Employe = s.employe  AND f.Date = s.Date ) AS Cpt6,  
(SELECT ValeurCalculee FROM StatCalc g WHERE ID_Cpt =14 AND g.Employe = s.employe  AND g.Date = s.Date ) AS Cpt7,
(SELECT ValeurCalculee FROM StatCalc h WHERE ID_Cpt =47 AND h.Employe = s.employe  AND h.Date = s.Date ) AS Cpt8,  
(SELECT ValeurCalculee FROM StatCalc i WHERE ID_Cpt =53 AND i.Employe = s.employe AND i.Date = s.Date  ) AS Cpt9,  
(SELECT ValeurCalculee FROM StatCalc j WHERE ID_Cpt =16 AND j.Employe = s.employe  AND j.Date = s.Date ) AS Cpt10
FROM StatCalc AS s
WHERE employe In (1,248)
GROUP BY Employe,Date;


 
Elle est assez simple à comprendre. On a une table StatCalc, composée de 4 champs (Employe, Date, Compteur, Valeur), qui donne une valeur a un compteur pour une date et un employé donnés.
Mon but est donc de choisir 10 compteurs et de faire une requete qui donne le tout en ligne.
 
Cette requête est super longue, auriez vous un moyen de diminuer tout ça svp ?

Reply

Marsh Posté le 04-09-2009 à 13:54:59   

Reply

Marsh Posté le 07-09-2009 à 09:26:05    

Visiblement ça ne plait pas ^^

Reply

Marsh Posté le 07-09-2009 à 23:05:02    

Si tu souhaites rassembler les résultats de plusieurs lignes sur une seule, ca ne va pas être facile en SQL standard. Faudrait voir s'il existe un équivalent en Access de la fonction GROUP_CONCAT de MySQL [:figti]

Reply

Marsh Posté le 08-09-2009 à 16:14:26    

Merci pour ta réponse.
 
Je n'ai jamais trouvé cet équivalent :(
Et Access ne permet pas de faire des curseurs (ou alors il me le cache bien :()

Reply

Marsh Posté le 15-09-2009 à 13:41:59    

Code :
  1. SELECT employe, Date,
  2. sum(case ID_Cpt when 9 then value when 12 then value else 0 end) as cpt1
  3. sum(case ID_Cpt when 10 then value else 0 end) as cpt2
  4. sum(case ID_Cpt when 11 then value else 0 end) as cpt3
  5. sum(case ID_Cpt when 7 then value else 0 end) as cpt4
  6. sum(case ID_Cpt when 51 then value else 0 end) as cpt5
  7. sum(case ID_Cpt when 46 then value else 0 end) as cpt6
  8. sum(case ID_Cpt when 14 then value else 0 end) as cpt7
  9. sum(case ID_Cpt when 47 then value else 0 end) as cpt8
  10. sum(case ID_Cpt when 53 then value else 0 end) as cpt9
  11. sum(case ID_Cpt when 16 then value else 0 end) as cpt10
  12. FROM StatCalc
  13. WHERE employe In (1,248)
  14. group by Employe,Date
 

Comme çà ?

 

Edit : Apparemment Access ne connait pas le "case when" (no comment), il faut donc remplacer par des IIF(expression,vrai,faux)
Donc comme çà :

Code :
  1. SELECT employe, Date,
  2. sum(IIF(ID_Cpt=9,value,IIF(ID_Cpt=12,value,0))) as cpt1
  3. sum(IIF(ID_Cpt=10,value,0)) as cpt2
  4. sum(IIF(ID_Cpt=11,value,0)) as cpt3
  5. sum(IIF(ID_Cpt=7,value,0)) as cpt4
  6. sum(IIF(ID_Cpt=51,value,0)) as cpt5
  7. sum(IIF(ID_Cpt=46,value,0)) as cpt6
  8. sum(IIF(ID_Cpt=14,value,0)) as cpt7
  9. sum(IIF(ID_Cpt=47,value,0)) as cpt8
  10. sum(IIF(ID_Cpt=53,value,0)) as cpt9
  11. sum(IIF(ID_Cpt=16,value,0)) as cpt10
  12. FROM StatCalc
  13. WHERE employe In (1,248)
  14. group by Employe,Date
 

Je n'ai pas testé, je n'ai pas de base Access sous la main (et je n'en veux pas ;) )


Message édité par cezium le 15-09-2009 à 14:06:36
Reply

Marsh Posté le 15-09-2009 à 16:23:04    

J'ai juste du rajouter les virgules à la fin de chaque sum mais ça a l'air nickel ! Le temps de finir les derniers tests, mais pour l'instant c'est plus que concluant :)
 
MERCI !

Reply

Sujets relatifs:

Leave a Replay

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