IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requete plus simple


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut Requete plus simple
    Bonjour à tous,

    Est il possible de simplifier cette requête pour éviter d'avoir 2 fois la même instruction select.

    Le select en bleu est le même que celui en rouge.

    Pour calculer mon disponible est ce que je pourrai utiliser le nom donné à mon select (reserves) au lieu de l'écrire de nouveau
    Merci d'avance de vos réponses, car c'est un cas qui m'arrive souvent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    select a.itmref_0,b.itmdes1_0,a.itmdesbpc_0,a.bpcnum_0,c.bpcnam_0,d.stofcy_0,e.physto_0,
    (select sum(rmnextqty_0)
        from orders f 
        where f.itmref_0=a.itmref_0 
        group by itmref_0) as reserves,
    (e.physto_0- (select sum(rmnextqty_0)
        from orders f 
        where f.itmref_0=a.itmref_0 
        group by itmref_0)) as disponible 
    from itmbpc a
    inner join itmmaster b on a.itmref_0=b.itmref_0
    inner join bpcustomer c on a.bpcnum_0=c.bpcnum_0
    inner join itmfacilit d on a.itmref_0=d.itmref_0 and d.stofcy_0='SG'
    left join itmmvt e on d.itmref_0=e.itmref_0 and d.stofcy_0=e.stofcy_0
    where a.itmref_0='010761';

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Tu n'es pas obligé d'utiliser une jointure triangulaire, tu peux faire le select en bleu et en rouge dans la clause from
    comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    select a.itmref_0,b.itmdes1_0,a.itmdesbpc_0,a.bpcnum_0,c.bpcnam_0,d.stofcy_0,e.physto_0,
     reserves,
    (e.physto_0- reserves) as disponible
    from itmbpc a
    inner join itmmaster b on a.itmref_0=b.itmref_0
    inner join bpcustomer c on a.bpcnum_0=c.bpcnum_0
    inner join itmfacilit d on a.itmref_0=d.itmref_0 and d.stofcy_0='SG'
    inner join
    (	select f.itmref_0, sum(rmnextqty_0) as reserves
    	from orders f
    	where f.itmref_0=a.itmref_0
    	group by f.itmref_0
    ) R
    on a.itmref_0=R.itmref_0
    left join itmmvt e on d.itmref_0=e.itmref_0 and d.stofcy_0=e.stofcy_0
    where a.itmref_0='010761';
    a+
    Soazig

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup de ta réponse,

    La requête finale est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT a.itmref_0,b.itmdes1_0,a.itmdesbpc_0,a.bpcnum_0,c.bpcnam_0,d.stofcy_0,e.physto_0,
     reserves,
    (e.physto_0- reserves) AS disponible
    FROM itmbpc a
    INNER JOIN itmmaster b ON a.itmref_0=b.itmref_0
    INNER JOIN bpcustomer c ON a.bpcnum_0=c.bpcnum_0
    INNER JOIN itmfacilit d ON a.itmref_0=d.itmref_0 AND d.stofcy_0='SG'
    INNER JOIN (SELECT f.itmref_0, sum(rmnextqty_0) AS reserves
                FROM orders f
                GROUP BY f.itmref_0) R
    ON a.itmref_0=R.itmref_0
    LEFT JOIN itmmvt e ON d.itmref_0=e.itmref_0 AND d.stofcy_0=e.stofcy_0
    WHERE a.itmref_0='010761';

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    imaginons maintenant que je veuille deux sommes qui sont fonction d'un critère where différent, comment je peux faire.

    Exemple je veux la somme des reserves qui correspond au critere "where f.type_0=1" (en rouge) et que je veux la somme des attendus qui correspond au critère "f.type_0=2".

    Est ce que je peux le faire dans le même select ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT a.itmref_0,b.itmdes1_0,a.itmdesbpc_0,a.bpcnum_0,c.bpcnam_0,d.stofcy_0,e.physto_0,
     reserves,
    (e.physto_0- reserves) AS disponible
    FROM itmbpc a
    INNER JOIN itmmaster b ON a.itmref_0=b.itmref_0
    INNER JOIN bpcustomer c ON a.bpcnum_0=c.bpcnum_0
    INNER JOIN itmfacilit d ON a.itmref_0=d.itmref_0 AND d.stofcy_0='SG'
    INNER JOIN (SELECT f.itmref_0, sum(rmnextqty_0) AS reserves
                FROM orders f
                where f.type_0=1
                GROUP BY f.itmref_0) R
    ON a.itmref_0=R.itmref_0
    LEFT JOIN itmmvt e ON d.itmref_0=e.itmref_0 AND d.stofcy_0=e.stofcy_0
    WHERE a.itmref_0='010761';

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous pouvez utiliser un CASE pour calculer ces deux valeurs dans votre sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    SELECT 
           a.itmref_0,
           b.itmdes1_0,
           a.itmdesbpc_0,
           a.bpcnum_0,
           c.bpcnam_0,
           d.stofcy_0,
           e.physto_0,
           R.reserves_1,
           (e.physto_0- R.reserves_1) AS disponible,
           R.reserves_2
    FROM itmbpc a
    INNER JOIN itmmaster b ON a.itmref_0=b.itmref_0
    INNER JOIN bpcustomer c ON a.bpcnum_0=c.bpcnum_0
    INNER JOIN itmfacilit d ON a.itmref_0=d.itmref_0 AND d.stofcy_0='SG'
    INNER JOIN 
    (
          SELECT 
                 f.itmref_0, 
                 sum(CASE f.type_0 WHEN 1 THEN rmnextqty_0 ELSE 0 END) AS reserves_1,
                 sum(CASE f.type_0 WHEN 2 THEN rmnextqty_0 ELSE 0 END) AS reserves_2
          FROM orders f
          where f.type_0 IN (1,2)
          GROUP BY f.itmref_0
    ) R
    ON a.itmref_0=R.itmref_0
    LEFT JOIN itmmvt e ON d.itmref_0=e.itmref_0 AND d.stofcy_0=e.stofcy_0
    WHERE a.itmref_0='010761';

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    OK c'est nickel, c'est vraiment ce que je voulais faire.

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD17] rendre cette requete plus simple
    Par android32 dans le forum WinDev
    Réponses: 3
    Dernier message: 02/01/2013, 12h12
  2. requete plus simple
    Par eric232 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/04/2009, 16h04
  3. Réponses: 6
    Dernier message: 09/11/2007, 10h38
  4. Pipes => pas plus simple ?
    Par Jorus dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 18h53
  5. Format date : y'a forcément plus simple...
    Par ZERS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/12/2004, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo