Coup de main pour une requete SQL

Coup de main pour une requete SQL - SQL/NoSQL - Programmation

Marsh Posté le 23-05-2007 à 11:48:49    

Bonjour,
 
Je n'arrive pas a formuler une requete SQL.
J'ai une table LIGNE_D qui contient des lignes d'inventaire et mon but est de sortir un résultat pour un article a une date on avait 10 articles avant et 8 après par exemple.
 
La table contient (entre autre) les champs ID(clé unique), date, id_article, qtt et donc quand on fait un inventaire des articles 2 lignes sont insérée dans cette table. Par exemple, si on avait 5 artilces abc1 et 4 apres inventaire on obtient
 
ID  Date    id_article  qtt
1   10/05   abc1        -5
2   10/05   abc1        4
 
Le problème est que si il y en avait 5 avant et 0 après la 2 ème ligne n'est pas ajoutée (ce n'est pas nous qui gerons ce comportement) on aurait donc juste:
ID  Date    id_article  qtt
1   10/05   abc1        -5
 
 
Et, ma query doit resortir dans le premier cas:
 
Date   id_article  qtt_avant  qtt_apres
10       abc1          5              4
 
et dans le 2ème:
 
Date   id_article  qtt_avant  qtt_apres
10       abc1          5              0
 
Pour l'instant j'utilise la query suivant:

Code :
  1. SELECT     LIGNES_D_1.[DATE], - LIGNES_D_1.Q AS Avant, LIGNES_D_2.Q AS Apres, LIGNES_D_1.ID
  2. FROM         LIGNES_D LIGNES_D_1 LEFT OUTER JOIN
  3.                       LIGNES_D LIGNES_D_2 ON LIGNES_D_1.ID <> LIGNES_D_2.ID AND LIGNES_D_1.[DATE] = LIGNES_D_2.[DATE] AND
  4.                       LIGNES_D_1.ID_ART = LIGNES_D_2.ID_ART
  5. WHERE     (LIGNES_D_2.Q < 0) AND (LIGNES_D_1.Q >= 0)
  6. ORDER BY LIGNES_D_1.[DATE]


 
Ca fonctionne bien pour le cas 1 mais ca ne me sort pas les cas2! Comment puis je faire?  
 
 
D'avance merci du coup de main...
 
 
Ben

Reply

Marsh Posté le 23-05-2007 à 11:48:49   

Reply

Marsh Posté le 23-05-2007 à 15:38:23    

C't'une merde sans nom ton truc :D
 
Désolé, là j'ai trop pas le temps de regarder...
 
Si t'as pas résolu ce soir, je jetterai un oeil :)

Reply

Marsh Posté le 23-05-2007 à 15:39:02    

Et t'as pas un cas 3 ?
 
Genre, avant, j'avais 0 (donc pas de ligne) mais maintenant j'en ai 10 ?


Message édité par MagicBuzz le 23-05-2007 à 15:39:12
Reply

Marsh Posté le 23-05-2007 à 19:35:02    

Alors voilà une requête qui donne ce que tu veux (y'a certainement moyen de faire autrement, mais pour une fois que je peux jouer avec FULL OUTER JOIN :love:)
 

Code :
  1. CREATE TABLE inv
  2. (
  3.  idinv numeric(18,0) NOT NULL PRIMARY KEY,
  4.  codpro char(4) NOT NULL,
  5.  qteinv numeric(18,0) NOT NULL,
  6.  datinv char(8) NOT NULL
  7. )
  8. go
  9. INSERT INTO inv (idinv, codpro, qteinv, datinv) VALUES (1, 'cas1', -5, '20070523');
  10. INSERT INTO inv (idinv, codpro, qteinv, datinv) VALUES (2, 'cas1', 4, '20070523');
  11. INSERT INTO inv (idinv, codpro, qteinv, datinv) VALUES (4, 'cas2', -5, '20070523');
  12. INSERT INTO inv (idinv, codpro, qteinv, datinv) VALUES (3, 'cas3', 5, '20070523');
  13. go
  14. SELECT isnull(v1.datinv, v2.datinv) date, isnull(v1.codpro, v2.codpro) produit, isnull(v1.qteinv * -1, 0) avant, isnull(v2.qteinv, 0) après
  15. FROM inv v1
  16. full OUTER JOIN inv v2 ON v2.idinv > v1.idinv AND v2.datinv = v1.datinv AND v2.codpro = v1.codpro
  17. WHERE
  18.     -- Filtre sur la date
  19.     (v1.datinv = '20070523' OR v1.datinv IS NULL)
  20. AND
  21. (
  22.     -- Filtre sur le cas 1
  23.     v1.qteinv < 0 AND v2.qteinv > 0
  24.     -- Filtre sur le cas 2    
  25.     OR v1.qteinv < 0 AND v2.qteinv IS NULL
  26.     -- Filtre sur le cas 3
  27.     OR v1.qteinv IS NULL AND v2.qteinv > 0
  28. )
  29. go


 
Sortie :


 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
 
(1 row(s) affected)
date     produit avant                                   après
-------- ------- --------------------------------------- ---------------------------------------
20070523 cas1    5                                       4
20070523 cas2    5                                       0
20070523 cas3    0                                       5
 
(3 row(s) affected)


Message édité par MagicBuzz le 23-05-2007 à 19:38:04
Reply

Marsh Posté le 24-05-2007 à 09:01:13    

cool merci je vais essayer ca...

Reply

Marsh Posté le 24-05-2007 à 09:32:16    

j'espère juste que ton SGBD supporte full outer join [:ddr555]

Reply

Sujets relatifs:

Leave a Replay

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