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

Requêtes MySQL Discussion :

SUM avec plusieurs variables


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2021
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2021
    Messages : 24
    Par défaut SUM avec plusieurs variables
    Bonjour,

    Je pêche sur quelque chose qui me semblait simple... (je suis plutôt novice sur SQL)

    Je cherche à avoir la dernière date d'inventaire d'un arcticle A (il y a plusieurs dates d'inventaire sur l'année). J'utilise donc MAX(date).
    Je souhaite aussi savoir si un article Y, il n'y a pas eu d'inventaire, donc que la requête me retour 'vide', mais ca je n'y arrive pas.

    La table se décompose ainsi:


    Ci dessous ma requête qui fonctionne pour les articles avec inventaire, mais je ne voit pas comment la modifier pour avoir les articles avec et sans inventaires.

    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
    		 A.partner,
    		 A.article,
    		 A.movement_date as "Date dernier inventaire",
    		 A.quantity as "Quantité Inventaire"
    FROM  "storage_history" AS  A
    INNER JOIN(	SELECT
    			 partner,
    			 article,
    			 MAX(movement_date) as MaxDate
    	FROM  "storage_history" 
    	WHERE	 "is_inventory"  like 'true'
    	GROUP BY partner,
    		  article 
    ) tm ON A.partner  = tm.partner
    	 AND	A.article  = tm.article
    	 AND	A.movement_date  = tm.MaxDate

    Merci pour votre aide ... :-)

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 648
    Billets dans le blog
    10
    Par défaut
    Bonjour

    Une jointer interne (INNER JOIN) n'est pas utilisable dans ce cas.
    Pour récupérer tous les articles, même ceux n'ayant jamais fait l'objet d'inventaire, il faut utiliser une jointure externe (OUTER JOIN).
    La syntaxe est la même .
    Mais il faut que cette jointure se fasse entre la table des article et celle des inventaires.

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2021
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2021
    Messages : 24
    Par défaut
    J'ai essayé avec ca, mais ca ne fonctionne pas .. ?

    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
    		 A.partner,
    		B."id",
    		 A.movement_date as "Date dernier inventaire",
    		 A.quantity as "Quantité Inventaire"
    FROM  "storage_history" AS  A
    OUTER JOIN(	SELECT
    			 partner,
    			 id,
    			 MAX(movement_date) as MaxDate
    	FROM  "storage_history" 
    	WHERE	 "is_inventory"  like 'true'
    	GROUP BY partner,
    		  id 
    ) tm ON A.partner  = tm.partner
    	 AND	B.id  = tm.id
    	 AND	A.movement_date  = tm.MaxDate  
    JOIN "product_product" AS  B ON B."id" = A.article
    -------------------------
    Détails de l’erreur :

    L’analyse syntaxique de la requête a échoué, veuillez vérifier la syntaxe

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2021
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2021
    Messages : 24
    Par défaut
    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
    		 B.partner,
    		 A."id",
    		 B.movement_date as "Date dernier inventaire",
    		 B.quantity as "Quantité Inventaire"
    FROM  "product_product" AS  A
    JOIN "storage_history" AS  B ON A."id"  = B."article" 
    JOIN(	SELECT
    			 partner,
    			 id,
    			 MAX(movement_date) as MaxDate
    	FROM  "storage_history" 
    	WHERE	 "is_inventory"  like 'true'
    	GROUP BY partner,
    		  id 
    ) tm ON B.partner  = tm.partner
    	 AND	A.id  = tm.id
    	 AND	B.movement_date  = tm.MaxDate

  5. #5
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2021
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2021
    Messages : 24
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour

    Une jointer interne (INNER JOIN) n'est pas utilisable dans ce cas.
    Pour récupérer tous les articles, même ceux n'ayant jamais fait l'objet d'inventaire, il faut utiliser une jointure externe (OUTER JOIN).
    La syntaxe est la même .
    Mais il faut que cette jointure se fasse entre la table des article et celle des inventaires.
    La requête ne me retourne rien..

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 648
    Billets dans le blog
    10
    Par défaut
    Comme indiqué plus haut, il manque une table "ARTICLE" et une table "INVENTAIRE"
    en toute logique, le modèle conceptuel devrait être du genre :

    [ARTICLE] 0,n --- (inventorier) --- 1,n [INVENTAIRE]

    L'article étant caractérisé par sa référence, sa désignation etc.
    L'inventaire par une date de début et de fin d'inventaire, un exercice comptable de rattachement, etc.
    Et la table issue de l'association "inventorier" sera porteuse de la quantité


    Si je me crée le jeu de données suivant :
    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
    18
    19
    20
    21
    22
    23
    24
    with AR_article (AR_ident, AR_ref, AR_lib) as
        (select 1, 'R65P12E', 'fer à souder 40W'         union all
         select 2, 'AC21002', 'clef plate 12mm'          union all
         select 3, '44-C-20', 'joint plat diam 30'       union all
         select 4, 'A50B01F', 'scie circulaire diam 260' union all
         select 5, 'R65P14E', 'fer à souder 60W'     
        )
       , IV_inventaire (IV_ident, IV_date) as
        (select 1, '2019-06-30'   union all 
         select 2, '2020-06-30'   union all
         select 3, '2021-06-30'
        )
       , AI_art_inv (IV_ident, AR_ident, AI_qte) as
        (select 1, 1, 040 union all
         select 1, 2, 060 union all
         select 1, 3, 440 union all
         select 1, 4, 012 union all
         select 2, 1, 022 union all
         select 2, 2, 081 union all
         select 2, 4, 010 union all
         select 3, 2, 077 union all
         select 3, 4, 015 union all
         select 3, 5, 040
        )

    Alors la requête qui suit donne bien la quantité au dernier inventaire, même pour les articles non inventoriés :
    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
    18
    19
    20
    select AR.AR_ref
         , AR.AR_lib
         , coalesce(S1.QtInv, 0)as  QteInv
         , (select max(IV_date) 
            from IV_inventaire) as  DteInv 
    from AR_article      as AR 
    left join 
         (select AR_ident
               , coalesce(AI_QTE, 0) as Qtinv
               , IV_date
          from AI_art_inv as AI
          inner join IV_inventaire as IV
             on IV.IV_ident=AI.IV_ident
          where IV.IV_date=
               (select max(IV_date) 
                from IV_inventaire
               )
         ) as S1
       on S1.AR_ident=AR.AR_ident   
    order by AR.AR_ref


    Résultat :

    AR_ref AR_lib QteInv DteInv
    44-C-20 joint plat diam 30 0 2021-06-30
    A50B01F scie circulaire diam 260 15 2021-06-30
    AC21002 clef plate 12mm 77 2021-06-30
    R65P12E fer à souder 40W 0 2021-06-30
    R65P14E fer à souder 60W 40 2021-06-30

    Note : pensez à utiliser les balises [CODE] pour encadrer les requêtes, en utilisant l'icone # de la barre d'outils

  7. #7
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2021
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2021
    Messages : 24
    Par défaut
    Je n'ai que 2 tables,

    1 avec le la référence de tous les articles,
    l'autre avec l'entrepôt, la référence de l'article inventorié (true = inventaire ou false= réception, expédition)
    la quantité de chaque mouvement
    la date du mouvement (inventaire ou mouvement)

    Aussi, je travaille sur une sorte de SQL sur Zoho, je n'ai pas la possibilité de faire 2 select à la suite comme tu l'as fais ...

  8. #8
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2021
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2021
    Messages : 24
    Par défaut
    Sinon, il y a moyen de prendre ma première requete qui fait le boulot pour les articles inventorié et ajouter à la suite autre chose pour avoir les articles "non inventorié" ?

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/12/2008, 11h33
  2. Appel d'une fonction avec plusieurs variables
    Par midoparis dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 13/05/2008, 11h53
  3. [URL Rewriting] Problème avec plusieurs variables
    Par kwzprtt dans le forum Apache
    Réponses: 2
    Dernier message: 13/05/2008, 01h00
  4. Procédure événementielle avec plusieurs variables
    Par Shadow5 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 17/04/2008, 15h10
  5. UPDATE avec plusieurs variables
    Par melmouj dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/03/2007, 14h51

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