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 :

Soustraction de plusieurs requêtes


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 46
    Points : 26
    Points
    26
    Par défaut Soustraction de plusieurs requêtes
    Bonjour,

    grâce à l'aide de certaines personnes du forum, j'ai pu créer 3 requêtes qui sont:

    REQUETE 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE ARTICLE 
    SET ARTICLE.qtedansstock11 = (SELECT SUM(QtiteFabNonEntSk)
                            FROM ETEMPS e, LCTE l
                            WHERE l.codearticle=ARTICLE.codearticle
                            AND e.CodeLanctimprod=l.CodeLancement
                            AND e.CodePoste IN ('MOUA','MOUB','MOUC','MOUP','MOUQ'))
    WHERE EXISTS (SELECT 1 FROM ETEMPS e, LCTE l
                  WHERE l.codearticle=ARTICLE.codearticle
                  AND e.CodeLanctimprod=l.CodeLancement
                  AND e.CodePoste IN ('MOUA','MOUB','MOUC','MOUP','MOUQ'));
    REQUETE 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE ARTICLE 
    SET ARTICLE.qtedansstock14 = (SELECT SUM(QuantiteExpediee)
                            FROM BDEC
                            WHERE BDEC.codearticleprestto=ARTICLE.codearticle
                            )
    WHERE EXISTS (SELECT 1 FROM BDEC
                  WHERE bdec.codearticleprestto=ARTICLE.codearticle
                  );
    REQUETE 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE ARTICLE 
    SET ARTICLE.qtedansstock13 = (SELECT SUM(Quantite)
                            FROM GPSQL.AB_REBUT_LCT
                            WHERE GPSQL.AB_REBUT_LCT.CodeRubrique=ARTICLE.codearticle
                            )
    WHERE EXISTS (SELECT 1 FROM GPSQL.AB_REBUT_LCT
                  WHERE GPSQL.AB_REBUT_LCT.CodeRubrique=ARTICLE.codearticle
                  );
    Mon but est de mettre dans une 4ème requête: requête 1 - requête 2 - requête 3.
    Cela fonctionne avec cette 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
     
    UPDATE ARTICLE 
    SET ARTICLE.qtedansstock15 = (SELECT SUM(QtiteFabNonEntSk)
                            FROM ETEMPS e, LCTE l
                            WHERE l.codearticle=ARTICLE.codearticle
                            AND e.CodeLanctimprod=l.CodeLancement
                            AND e.CodePoste IN ('MOUA','MOUB','MOUC','MOUP','MOUQ')) - (SELECT SUM(QuantiteExpediee)
                            FROM BDEC
                            WHERE BDEC.codearticleprestto=ARTICLE.codearticle
                            ) - (SELECT SUM(Quantite)
                            FROM GPSQL.AB_REBUT_LCT
                            WHERE GPSQL.AB_REBUT_LCT.CodeRubrique=ARTICLE.codearticle
                            )
    WHERE EXISTS (SELECT 1 FROM ETEMPS e, LCTE l, BDEC, GPSQL.AB_REBUT_LCT
                  WHERE l.codearticle=ARTICLE.codearticle
                  AND e.CodeLanctimprod=l.CodeLancement
    	      AND GPSQL.AB_REBUT_LCT.CodeRubrique=ARTICLE.codearticle
    	      AND bdec.codearticleprestto=ARTICLE.codearticle
                  AND e.CodePoste IN ('MOUA','MOUB','MOUC','MOUP','MOUQ'));
    Le seul problème c'est que ce calcul se fait seulement si les résultats des requêtes 1, 2, 3 contiennent des valeurs différentes de 0.

    Exemple: Si ma requête 1 me retourne 10, ma requête 2: 0 et ma requête 3: 5. Mon résultat serait de 5 et non de 0 comme il l'est actuellement. J'ai vérifier pour toute ma base de données, dès que j'ai au minimum un 0 en résultat d'une de mes requêtes, le résultat final ne se fait pas. Auriez-vous une idée?
    Merci.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Salut,

    Est ce que qtedansstock15 est définit comme colonne (not null) default 0 ?

    Si tu travailles dans la même session, ou si tes précédentes modifs ont été commitées, tu peux peut être utiliser directement cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE ARTICLE
    SET qtedansstock15 = (case when qtedansstock11 is not null then qtedansstock11 else 0 end -
                                  case when qtedansstock14 is not null then qtedansstock14 else 0 end -
                                  case when qtedansstock13 is not null then qtedansstock13 else 0 end)
    Sinon explicite peut être dans tes sommes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(case when QtiteFabNonEntSk is null then 0 else QtiteFabNonEntSk)
    Enfin je penche pour un problème de NULL, mais peut être pas ...

    PS : ah je vois, en fait, il n'aimait pas l'alias, il fallait reprendre le nom de la table...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    En faite avant chacune des 3 premières requêtes, j'affectais automatiquement 0 à tous les champs. J'ai testé la requête ci-dessous que vous m'avez conseillé et cela fonctionne. Merci beaucoup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE ARTICLE
    SET ARTICLE.qtedansstock15 = (case when ARTICLE.qtedansstock11 IS NOT NULL then ARTICLE.qtedansstock11 else 0 end -
                                  case when ARTICLE.qtedansstock14 IS NOT NULL then ARTICLE.qtedansstock14 else 0 end -
                                  case when ARTICLE.qtedansstock13 IS NOT NULL then ARTICLE.qtedansstock13 else 0 end)

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous avez une fonction pour gérer les nulls : COALESCE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE ARTICLE
    SET qtedansstock15 = COALESCE(qtedansstock11, 0) - COALESCE(qtedansstock14, 0) - COALESCE(qtedansstock13, 0)
    Notez bien que sans WHERE toute votre table Article sera mise à jour.

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

Discussions similaires

  1. [CR11] Données de plusieurs requêtes
    Par KrusK dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 07/07/2005, 11h02
  2. Réponses: 4
    Dernier message: 04/07/2005, 09h36
  3. [JDBC] Faire plusieurs requète
    Par picomz dans le forum JDBC
    Réponses: 9
    Dernier message: 25/05/2005, 14h33
  4. [Optimisation] Que privilégier : une ou plusieurs requêtes ?
    Par Dimitri01 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/01/2004, 11h29
  5. [Technique] Conflits entre plusieurs requêtes
    Par Neowile dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 24/03/2003, 09h37

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