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 :

Calcul de sommes


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Calcul de sommes
    Bonjour,

    J'ai un petit souci avec une requête SQL.

    Je veux calculer la somme de la quantité d'entrée d'un article,
    la somme de la quantité de sortie de ce même article et la quantité
    disponible de cet article, c'est à dire sum(quantité d'entrée) -
    sum(quantité de sortie).

    voici le contenu de mes tables:

    table entrees_stock: ID, cod_art, quantite_ret
    table sorties_stock: ID, cod_art, quantite_ss

    voici la requête SQL que j'ai executé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT e.cod_art, sum(e.quantite_ret) AS RETENUE, sum(s.quantite_ss) AS SORTIE, sum(e.quantite_ret-s.quantite_ss) AS STOCK
    FROM entrees_stock e ,sorties_stock s
    WHERE e.cod_art=s.cod_art  
    GROUP BY e.cod_art;
    Voici le resultat de la requête:

    15 4 4 0

    alors que le resultat que je cherche a avoir est:

    15 2 2 0


    voici les champs que j'ai insere dans chacune des tables

    entrees_stock: 1, 15, 1
    2, 15, 1

    sorties_stock: 1, 15, 1
    2, 15, 1

    Merçi pour votre aide

  2. #2
    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,

    N'avez vous pas de table "article"?

    Il est normal que vos resultats se dedoublent, une ligne de votre table "entrees" correspondant à deux dans la table "sorties". Faites votre aggregation avant la jointure, et au passage utilisez la syntaxe normalisée.
    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
    SELECT 
           e.cod_art, 
           e.retenue, 
           s.sortie, 
           e.retenue - s.sortie AS stock
    FROM 
         (
          SELECT cod_art, sum(quantite_ret) AS retenue
          FROM entrees_stock
          GROUP BY cod_art
         ) e
    INNER JOIN 
         (
          SELECT cod_art, sum(quantite_ss) AS sortie
          FROM sorties_stock 
          GROUP BY cod_art
         ) s
    ON e.cod_art = s.cod_art;

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merçi bcp snipah

    J'ai effectivement aussi une table article contenant l'ID article et le libellé. j'avais oublié de la mentionner.

    Sinon, la requete marche a la perfection. Merçi encore.

  4. #4
    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
    Si vous disposez d'une table article, il serait peut être mieux de l'utiliser comme point de départ.
    Ca vous permet d'avoir tous les articles, même dans le cas ou vous n'avez aucune entree et sortie pour un article. En plus, vous pourrez au passage afficher le libellé :
    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
     
    SELECT 
           a.cod_art, 
           a.libelle,
           coalesce(e.retenue,0) AS retenue, 
           coalesce(s.sortie,0) AS sortie,  
           coalesce(e.retenue,0) - coalesce(s.sortie,0) AS stock
    FROM article a
    LEFT JOIN
         (
          SELECT cod_art, sum(quantite_ret) AS retenue
          FROM entrees_stock
          GROUP BY cod_art
         ) e
    ON a.cod_art = e.cod_art
    LEFT JOIN 
         (
          SELECT cod_art, sum(quantite_ss) AS sortie
          FROM sorties_stock 
          GROUP BY cod_art
         ) s
    ON a.cod_art = s.cod_art;
    Le coalesce remplacera l'absence de valeur par 0.

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    En effet l'utilisation de la table article comme point de départ est plus judicieux. Je n'y avais pas pensé. Merçi.

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

Discussions similaires

  1. [newbie]comment calculer la somme des nb pages sum()?
    Par megapacman dans le forum Débuter
    Réponses: 3
    Dernier message: 13/06/2006, 11h03
  2. [iReport] Calcul de somme de variables et fusion de données
    Par RR instinct dans le forum iReport
    Réponses: 7
    Dernier message: 03/04/2006, 16h04
  3. calculer la somme
    Par pierrot67 dans le forum Bases de données
    Réponses: 5
    Dernier message: 21/03/2006, 22h50
  4. [XSLT] calcul de somme
    Par Mr N. dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 09/09/2005, 12h20
  5. [CR 8.5] Calculer la somme d'une somme
    Par Frederic Vincent dans le forum Formules
    Réponses: 4
    Dernier message: 12/02/2004, 17h53

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