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 :

Double somme dans même requête


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut Double somme dans même requête
    Bonjour,
    Pas sur que je sois au bon endroit pour poster ce message menfin bon je n'ai pas trouvé de forum SQL.
    Bref, mon idée est de calculer 2 sommes dans une même requête.... J'ai essayé plusieurs solutions et n'ai pas encore trouvé mon bonheur.. Je vous explique:

    J'aimerais pour chaque article:
    -calculer le stock (en faisant une somme des mouvements de stock)
    -calculer le total des précommandes en faisant la somme de toutes les lignes de pré-commande.
    Et dans la même requête ne sélectionner que les lignes dont stock<pré-commandes.

    Pour l'instant je fais (grossomodo) cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with T as (
    SELECT CODARTICLE, SUM(QTSTOCK)AS STOCKTHEORIQUE 
    FROM ARTICLES 
    LEFT JOIN STOCK ON PATATIPATATA
    GROUP BY CODARTICLE
    ) 
    SELECT CODARTICLE, STOCKTHEORIQUE, SUM(QTPRECOMMANDES) AS PRECOMMANDES
    FROM T 
    LEFT JOIN LIGNESCOMMANDES ON PATATIPATATA
    GROUP BY CODARTICLE, STOCKTHEORIQUE
    Je calcule donc bien pour chaque article le stock+ la quantité de précommandes.
    mais je ne sais pas comment ne sélectionner que ceux où stock<précommandes.
    Je voulais ré-inclure tout ça dans un WITH ... mais cela ne passe pas.
    Là je crois qu'il me manque une notion SQL importante!!

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    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 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    Peut-être avec une clause HAVING en plus ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH T AS (
    SELECT CODARTICLE, SUM(QTSTOCK)AS STOCKTHEORIQUE 
    FROM ARTICLES 
    LEFT JOIN STOCK ON PATATIPATATA
    GROUP BY CODARTICLE
    ) 
    SELECT CODARTICLE, STOCKTHEORIQUE, SUM(QTPRECOMMANDES) AS PRECOMMANDES
    FROM T 
    LEFT JOIN LIGNESCOMMANDES ON PATATIPATATA
    GROUP BY CODARTICLE, STOCKTHEORIQUE
    HAVING STOCKTHEORIQUE< SUM(QTPRECOMMANDES)

    tatayo.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut
    EFffectivement ça marche, merci Tatayoyo!!
    ma difficulté était aussi de gérer un case pour cette somme en fonction de l'unité de commande du coup cela done apu près ça:

    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
    WITH T AS (
    SELECT CODARTICLE, SUM(QTSTOCK)AS STOCKTHEORIQUE 
    FROM ARTICLES 
    LEFT JOIN STOCK ON PATATIPATATA
    GROUP BY CODARTICLE
    ) 
    SELECT CODARTICLE, STOCKTHEORIQUE, 
    CASE UNITE 
      WHEN POIDS THEN SUM(POIDSPRECOMMANDES)
      WHEN PIECE THEN SUM(PIECESPRECOMMANDEES)
    END AS PRECOMMANDES
    FROM T 
    LEFT JOIN LIGNESCOMMANDES ON PATATIPATATA
    GROUP BY CODARTICLE, STOCKTHEORIQUE
    HAVING STOCKTHEORIQUE< CASE UNITE 
      WHEN POIDS THEN SUM(POIDSPRECOMMANDES)
      WHEN PIECE THEN SUM(PIECESPRECOMMANDEES)
    END
    Etant donnée que cela me semble quand meme super lourd est-ce qu'il y a une méthode plus propre/efficace pour ce genre de cas (double sommes)?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    On a apporté une solution plus normée dans la section Delphi : Double somme dans meme requete


    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
    15
    16
    17
    SELECT CODARTICLE, SUM(QTSTOCK) AS STOCKTHEORIQUE, 
      SUM(
        CASE UNITE 
          WHEN POIDS THEN SUM(POIDSPRECOMMANDES)
          WHEN PIECE THEN SUM(PIECESPRECOMMANDEES)
        END
      ) AS PRECOMMANDES
    FROM ARTICLES
    LEFT JOIN STOCK ON PATATIPATATA_STOCK
    LEFT JOIN LIGNESCOMMANDES ON PATATIPATATA_LIGNE
    GROUP BY ARTICLES.CODARTICLE
    HAVING SUM(QTSTOCK) < SUM(
                           CASE UNITE 
                             WHEN POIDS THEN SUM(POIDSPRECOMMANDES)
                             WHEN PIECE THEN SUM(PIECESPRECOMMANDEES)
                           END
                         )

    Pour les éventuels NULL
    QTPRECOMMANDES -> CASE WHEN QTPRECOMMANDES IS NULL THEN 0 ELSE QTPRECOMMANDES END

  5. #5
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Juste deux remarques :
    - La clause WITH, c'est de la norme (SQL 1999). Ca passe au moins sous Oracle 9+, SQL Server (je sais plus quelle version), Postgres, DB2 (il me semble)
    - Toujours normé, COALESCE(QTPRECOMMANDES, 0) permet de remplacer ton CASE ... IS NULL

Discussions similaires

  1. Problème de double limite dans une requête mysql
    Par bbbbruno dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/01/2009, 19h21
  2. [A-03] Somme dans une requête
    Par mathilde50 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/11/2008, 17h57
  3. Calcul d'une différence de sommes dans une requête
    Par oohcalme dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 07/07/2008, 11h56
  4. Doubles comptes dans une requête somme
    Par aba_tarn dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/03/2008, 14h59
  5. CompteDe + % dans même requête
    Par Nessie37 dans le forum Requêtes et SQL.
    Réponses: 21
    Dernier message: 05/11/2007, 18h15

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