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 :

Petit souci pour faire une différence de sommes


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 105
    Points : 53
    Points
    53
    Par défaut Petit souci pour faire une différence de sommes
    j' ai un petit souci pour faire une différence en sql: voici mes essais:
    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
     
    #variable 1 output = 123
    SELECT sum(a.qte)
    FROM gest_ligne_appro a, gest_article c
    WHERE c.id = a.article_id AND c.id = 1
     
    #variable 2 output = 20
    SELECT sum(b.qte)
    FROM gest_ligne_vente b, gest_article c
    WHERE c.id = b.article_id AND c.id = 1
     
    #et voici maitenent comment je fait la difference
    SELECT sum(a.qte) - sum(b.qte) 
    FROM gest_ligne_appro a, gest_ligne_vente b, gest_article c
    WHERE  c.id = 1 AND c.id = a.article_id AND c.id = b.article_id
     
    #output = 186 au lieu de 103
    ma requete me donne une valeur inattendu: 186 au lieu de 103
    comment puis-je la corrigee?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 878
    Points
    12 878
    Par défaut
    Bonjour,
    Le résultat ne me surprend pas.
    Dans la première requête, tu prends en compte tous les produits qui ont au moins une ligne d'appro.
    Dans la deuxième, tu prends tous les articles qui ont au moins une ligne de vente.
    Et dans la troisième, tu ne prends que les articles qui ont au moins une ligne d'appro ET au moins une ligne de vente.
    Qui plus est, si pour un même produit tu as plusieurs lignes de vente et d'appro, les sommes seront fausses. Pour s'en convaincre il suffit d'enlever le SUM (et le GROUP BY) et de voir ce que renvoie la requête…

    Il existe plusieurs solutions, par exemple avec des sous-requêtes:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select a.id,coalesce(srt.somme,0),coalesce(ent.somme,0)
    from article as a
    left outer join (select sum(qte) as somme from vte where vte.idarticle = a.id) as srt
    left outer join (select sum(qte) as somme from appro where appro.idarticle = a.id) as ent
    J'ai mis des COALESCE pour gérer les articles qui n'auraient pas de ligne d'appro et/ou de ligne de vente.

    Tatayo.
    P.S. tes requêtes gagneraient beaucoup en lisibilité si tu utilisais JOIN pour les jointures

  3. #3
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 785
    Points : 1 495
    Points
    1 495
    Par défaut
    Bonjour,
    Citation Envoyé par Toogda Voir le message
    j' ai un petit souci pour faire une différence en sql: voici mes essais:
    Pas d'incohérence pour moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #variable 1 output = 123
    SELECT sum(a.qte)
    FROM gest_ligne_appro a, gest_article c
    WHERE c.id = a.article_id AND c.id = 1
    C'est le cas avec cette matrice :
    c.id a.id a.qte
    1 1 40
    2 2 83
    Sum(a.qte) = 123

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #variable 2 output = 20
    SELECT sum(b.qte)
    FROM gest_ligne_vente b, gest_article c
    WHERE c.id = b.article_id AND c.id = 1
    C'est le cas avec cette matrice :
    c.id b.id b.qte
    1 1 20
    2 2 0
    2 2 0
    Sum(b.qte) = 20

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #et voici maitenent comment je fait la difference
    SELECT sum(a.qte) - sum(b.qte) 
    FROM gest_ligne_appro a, gest_ligne_vente b, gest_article c
    WHERE  c.id = 1 AND c.id = a.article_id AND c.id = b.article_id
     #output = 186 au lieu de 103
    Non, la jointure des matrices donne bien 186.
    c.id a.id a.qte b.id b.qte
    1 1 40 1 20
    2 2 83 2 0
    2 2 83 2 0
    Sum(a.qte) = 206
    Sum(b.qte) = 20
    Sum(a.qte) - Sum(b.qte) = 206 - 20 = 186


    Citation Envoyé par Toogda Voir le message
    ma requete me donne une valeur inattendu: 186 au lieu de 103
    comment puis-je la corrigee?
    Revoir l'expression du besoin pour adapter la requête de conséquence.

    Dis nous en plus sur le résultat à attendre.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    Dis nous en plus sur le résultat à attendre.
    je veut tout simplement a avoir la quantité restante de chaque article après les mouvement d’entrée (appro) et de sortie (vente)
    pour l'exemple que j'ai utilise:
    appro = 123 pour l'article 1
    vente = 20 pour l'article 1

    donc ce que j veut obtenir pour l'article 1 c'est 103 soit la requête qui pourra me donner 123 - 20

    Il existe plusieurs solutions, par exemple avec des sous-requêtes:
    j'ai essayer t'a requête mais je rencontre une erreur:
    sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select a.id,coalesce(srt.somme,0),coalesce(ent.somme,0)
    from gest_article as a
    left outer join (select sum(vte.qte) as somme from gest_ligne_vente as vte where vte.article_id = a.id) as srt
    left outer join (select sum(appro.qte) as somme from gest_ligne_appro as appro where appro.article_id = a.id) as ent
    erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ERREUR:  erreur de syntaxe à la fin de l\'entrée
    LINE 4: ...t_ligne_appro as appro where appro.article_id = a.id) as ent

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 878
    Points
    12 878
    Par défaut
    Bonjour,
    Peut-être ainsi alors:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    select article_id,sum(appro),sum(vte)
    from
    (
    SELECT a.article_id,sum(a.qte) as appro,0 as vte
    FROM gest_ligne_appro a, gest_article c
    WHERE c.id = a.article_id AND c.id = 1
    group by a.article_id
    union
    SELECT a.article_id,0,sum(b.qte)
    FROM gest_ligne_vente b, gest_article c
    WHERE c.id = b.article_id AND c.id = 1
    group by a.article_id
    ) group by a.article_id

    Tatayo.

  6. #6
    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 388
    Points
    18 388
    Par défaut
    Si vous travaillez sur peu d'articles, vous pouvez utiliser des sous-requêtes scalaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select c.id
         , coalesce((select sum(qte) from gest_ligne_appro a where a.article_id = c.id), 0)
         - coalesce((select sum(qte) from gest_ligne_vente b where b.article_id = c.id), 0) as diff_appro_vente
      from gest_article c
     where c.id = 1;
    Si vous travaillez sur beaucoup d'articles, il vaut mieux utiliser des tables dérivées :
    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 c.id
             , coalesce(a.qte_appro, 0)
             - coalesce(b.qte_vente, 0) as diff_appro_vente
          from gest_article c
     left join ( select idarticle
                      , sum(qte) as qte_appro
                   from gest_ligne_appro
               group by idarticle
               ) a on a.article_id = c.id
     left join ( select article_id
                      , sum(qte) as qte_vente
                   from gest_ligne_vente
               group by article_id
               ) b on b.article_id = c.id;

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 105
    Points : 53
    Points
    53
    Par défaut
    MERCI A TOUS !

    LES DEUX SOLUTION DE Waldar RESOLVENT correctement mon souci

    A la prochaine!

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

Discussions similaires

  1. petit soucis pour rajouter une droite d'intersectionà une courbe
    Par souchi6 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 19/03/2013, 14h17
  2. Petit soucis pour insérer une image dans un userform uniquement
    Par panda78 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/07/2012, 11h50
  3. Requete pour faire une différence entre deux dates
    Par PkoiTan2N dans le forum SQL
    Réponses: 2
    Dernier message: 28/04/2011, 13h14
  4. Probleme pour faire une somme sous Excel
    Par Nicolas92 dans le forum Excel
    Réponses: 5
    Dernier message: 02/12/2005, 11h38
  5. Probleme pour faire une somme dans header ??
    Par snoop57 dans le forum Access
    Réponses: 7
    Dernier message: 01/12/2005, 13h40

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