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

Bases de données Delphi Discussion :

Double somme dans meme requete


Sujet :

Bases de données Delphi

  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 meme requete
    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 meme requete.... J'ai essayé plusiseurs solutions et n'ai pas encore toruvé 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
    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
    Citation Envoyé par MickSou Voir le message
    Bonjour,
    Pas sur que je sois au bon endroit pour poster ce message menfin bon je n'ai pas trouvé de forum SQL.
    section SQL et section SGBD
    Quel SGBD ?
    C'est quoi WITH ?

    Partons sur une requête SQL-92
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CODARTICLE, SUM(CASE WHEN QTSTOCK IS NULL THEN 0 ELSE QTSTOCK END) AS STOCKTHEORIQUE, SUM(QTPRECOMMANDES) AS PRECOMMANDES
    FROM ARTICLES
    LEFT JOIN STOCK ON ARTICLES.ID = STOCK.ID_ARTICLE
    LEFT JOIN LIGNESCOMMANDES ON ARTICLES.ID = LIGNESCOMMANDES.ID_ARTICLE
    GROUP BY ARTICLES.CODARTICLE
    HAVING STOCKTHEORIQUE < PRECOMMANDES

    tu pourras selon ton SGBD, retirer le CASE WHEN (certaines DB gère le NULL comme un Zéro dans les fonctions d'aggrégats
    Certains fournissent le IF
    Sinon lire Opérateurs de traitement des marqueurs NULL



    ta jointure PATATIPATATA doit à chaque fois partir de ARTICLES, surtout pas de lien entre STOCK et LIGNESCOMMANDES

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 115
    Points : 41 246
    Points
    41 246
    Billets dans le blog
    63
    Par défaut
    @Shailetroll
    une fois n'est pas coutume , le WITH , du moins en firebird crée une ou plusieurs CTE

    @micksou
    shailetroll a répondu il suffit d'ajouter le
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING  SUM(QTSTOCK) < SUM(QTPRECOMMANDES)

  4. #4
    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
    Merci Shai pour le plan détaillé!! Pas très bien réveillé ce matin j'ai posté ici avant de poster ensuite dans le bon forum mais permet moi de remarquer que le titre "SGBD et SQL" dans la section SGBD pour discuter de SQL n'est pas forcément très clair... SQL dans langages me conviendrait plus.. menfin....

    Mon SGBD: DB2 sur AS400

    Pour votre solution je teste ça et vous dis quoi... .c'est plus ou moins ce que j'avais essayé, mais il avait tendance à reprendre autant de fois le calul des précommandes en fonction du nombre de lignes de stock. Un point pour vous j'ométais d'utiliser le having! par contre cela marchera seulement avec ce que propose Sergio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING  SUM(QTSTOCK) < SUM(QTPRECOMMANDES)
    car il n'aime pas reprendre le résultat d'une fonction agrégat avec son Alias.

  5. #5
    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
    Oui, l'utilisation des Alias ne fonctionne que sur peu de SGBD, sur Sybase cela fonctionne, je crois que sur MySQL4 cela ne passait pas à mes souvenirs !

    Fait attention aux valeurs NULL fournis par des LEFT JOIN sans "enfants"
    En Sybase, j'ai un Warning de conversion implicite, je n'ai pas testé depuis Delphi mais depuis l'outil intégré (certains messages SYBASE sont ignorés en passant par Delphi)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING SUM(CASE WHEN QTSTOCK IS NULL THEN 0 ELSE QTSTOCK END) < SUM(CASE WHEN QTPRECOMMANDES IS NULL THEN 0 ELSE QTPRECOMMANDES END)

    Idem, CASE WHEN pourra être remplacé par IF ou ISNULL sur DB2 le fourni !

  6. #6
    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
    Bon donc votre proposition est bien ce que j'avais fait au début... et ça marche pô !

    Je m'explique:

    Je fais le teste sur un produit qui a
    -3 lignes pour les mouvements de stock.
    -2 lignes pour les pré-commandes.
    Du coup je trouve pour valeurs : 2x le stock réel et 3x les pré-commandes réelles!

    Je vais donc reprendre la création de vues à la volée comme conseillé par qqn d'autre ici.

  7. #7
    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
    Le LEFT JOIN est-il indispensable ?
    Avec INNER JOIN, cela fonctionne-t-il ?
    Typique, le LEFT JOIN te renvoi autant de ligne par jointure, dans les cardinalités explose comme dans un CROSS JOIN

    Une variante puisque tu sembles juste vouloir obtenir que les Articles dont le Stock est insuffisant pour les Pré-Commandes (note le changement des JOIN, cette un lien entre LIGNESCOMMANDES et STOCK, c'est peut être un peu moche mais ça pourrait fonctionner, tout dépend la complexité de PATATIPATATA)
    LEFT c'est pour les artciles qui n'ont même pas une entrée dans le stock
    idem, à toi de voir, si INNER est possible ou pas !

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT CODARTICLE, SUM(QTSTOCK) AS STOCKTHEORIQUE, SUM(QTPRECOMMANDES) AS PRECOMMANDES
    FROM ARTICLES
    INNER JOIN LIGNESCOMMANDES ON ARTICLES.CODARTICLE = LIGNESCOMMANDES.CODARTICLE
    LEFT JOIN STOCK ON LIGNESCOMMANDES .CODARTICLE = STOCK.CODARTICLE
    GROUP BY ARTICLES.CODARTICLE
    HAVING  SUM(QTSTOCK) < SUM(QTPRECOMMANDES)

Discussions similaires

  1. Double somme dans meme requete
    Par MickSou dans le forum DB2
    Réponses: 3
    Dernier message: 16/11/2011, 14h17
  2. Somme dans une requete SQL
    Par LP-mpascolo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/04/2007, 10h26
  3. Somme dans une requete avec regroupement
    Par louroulou dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/07/2006, 21h20
  4. Sommes dans une requete d'un formulaire
    Par moto25 dans le forum Access
    Réponses: 7
    Dernier message: 14/11/2005, 18h46
  5. Somme dans une requete
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2004, 10h40

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