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

Développement SQL Server Discussion :

Extraction des mouvements mensuels existants et inexistants [2012]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Par défaut Extraction des mouvements mensuels existants et inexistants
    Bonjour,

    Je rencontre un soucis quand j'observe une table de mouvements de pièce.

    Afin de savoir la quantité moyenne de pièce mouvementée par mois j’exécute la requête suivante :
    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
    select	PIECE.code
    		,PIECE.DESIGN
    		,sum(Mouvement.QTE)'qté/mois'
    		,MONTH(Mouvement.DATE_MVT) 'mois'
    		,YEAR(Mouvement.DATE_MVT)'année'
     
    from	T_PIECE PIECE 
    		inner join T_MVT Mouvement on Mouvement.CLE_PIECE = PIECE.CLE_PIECE
     
    where	year(Mouvement.DATE_MVT) in (2017,2018,2019)
    		and Mouvement.qte <0
    		and Mouvement.TYPE_MVT in (1,3) 
     
    group by YEAR(Mouvement.DATE_MVT)
    		,MONTH(Mouvement.DATE_MVT)
    		,PIECE.code
    		,PIECE.DESIGN
    Le problème de la requête c'est que lorsque je ne mouvemente pas de pièce pendant 1 mois, je n'ai pas la ligne de pièce correspondante le mois. Je souhaiterai avoir 0.

    J'ai commencé à réfléchir mais je n'arrive pas trouver une solution pour avoir le fonctionnement souhaité.

    J'ai essayé de faire un left join sur la table des mouvements mais le problème c'est que je n'ai pas le mois qui n'a pas de mouvement...

    Si quelqu'un a une idée, je suis preneur...

    Merci.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Citation Envoyé par alexandre42 Voir le message
    J'ai essayé de faire un left join sur la table des mouvements mais le problème c'est que je n'ai pas le mois qui n'a pas de mouvement...
    Tu n'as d'autre choix que de passer par une table calendrier... qui peut très bien n'être qu'une requête sur tes donné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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    select  PCE.CODE
        ,   PCE.DESIGN
        ,   sum(MVT.QTE)    'qté/mois'
        ,   CLD.MOIS        'mois'
        ,   CLD.ANNEE       'année'
    from    T_PIECE as  PCE 
        cross join
            (   select  distinct
                        year(DATE_MVT)          as  ANNEE
                    ,   month(MONTHDATE_MVT)    as  MOIS
                from    T_Mvt
                where   year(DATE_MVT) in (2017, 2018, 2019)
            )   as  CLD
        left join 
            T_MVT   as  MVT 
            on  MVT.CLE_PIECE       = PCE.CLE_PIECE
            and year(MVT.DATE_MVT)  = CLD.ANNEE
            and month(MVT.DATE_MVT) = CLD.MOIS
    where   MVT.QTE         <   0
        and MVT.TYPE_MVT    in  (1, 3) 
    group by PCE.CODE
        ,   PCE.DESIGN
        ,   CLD.MOIS
        ,   CLD.ANNEE
    Cela ne sortira pas de ligne pour les mois où il n'y a eu aucun mouvement sur aucune pièce mais permettra toutefois de diminuer le nombre de lignes "oubliées".
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Par défaut
    Bonjour,

    J'ai pu finalement m'en sortir grâce à votre requête. J'ai faitun cross join en incluant les résultat NULL de la jointure gauche.

    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
    23
    24
    25
    select  PCE.CODE
        ,   PCE.DESIGN
        ,   iif( sum(MVT.QTE) is null, 0 ,sum(MVT.QTE))   'qté/mois'
        ,   CLD.MOIS        'mois'
        ,   CLD.ANNEE       'année'
    from    T_PIECE as  PCE 
        cross join
            (   select  distinct
                        year(DATE_MVT)          as  ANNEE
                    ,   month(DATE_MVT)    as  MOIS
                from    T_Mvt
                where   year(DATE_MVT) in (2017, 2018, 2019)
            )   as  CLD
        left join 
            T_MVT   as  MVT 
            on  MVT.CLE_PIECE       = PCE.CLE_PIECE
            and year(MVT.DATE_MVT)  = CLD.ANNEE
            and month(MVT.DATE_MVT) = CLD.MOIS
    		and mvt.qte<0
    where   (MVT.TYPE_MVT    in  (1, 3) ) or mvt.CLE_MVT is null
    group by PCE.CODE
        ,   PCE.DESIGN
        ,   CLD.MOIS
        ,   CLD.ANNEE
    order by    PCE.CODE,   CLD.ANNEE,   CLD.MOIS
    Merci en tout cas

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

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 961
    Par défaut
    Bonsoir Alexandre42,

    Pour pinailler un peu
    la même requête réécrite avec :
    * utilisation des CTE (with)
    * Utilisation de ISNULL()
    * Utilisation des [ ]

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ;with 
    CLD as
        (   select  distinct
                      year(DATE_MVT)   as  ANNEE
                    , month(DATE_MVT)  as  MOIS
            from    T_Mvt
            where   year(DATE_MVT) in (2017, 2018, 2019)
        )
    , MVT as
        (   select CLE_PIECE 
                 , year(DATE_MVT) as ANNEE
                 , month(DATE_MVT) as MOIS
            from T_MVT
            where mvt.qte < 0
                AND MVT.TYPE_MVT in (1, 3)
        )
    select  PCE.CODE
        ,   PCE.DESIGN
        ,   ISNULL(sum(MVT.QTE), 0) as [qté/mois]
        ,   CLD.MOIS as [mois]
        ,   CLD.ANNEE as [année]
    from    T_PIECE as  PCE 
        cross join CLD
        left join MVT 
            on  MVT.CLE_PIECE       = PCE.CLE_PIECE
            and MVT.ANNEE  = CLD.ANNEE
            and MVT.MOIS = CLD.MOIS
    group by PCE.CODE
        ,   PCE.DESIGN
        ,   CLD.MOIS
        ,   CLD.ANNEE
    order by    PCE.CODE,   CLD.ANNEE,   CLD.MOIS
    Enfin ... si je ne me suis pas lourdé dans la réécriture

  5. #5
    Membre confirmé
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Par défaut
    Bonjour Michel,

    Merci pour le retour. La requête me permet d'inclure des ligne que je n'arrivais pas inclure.

    Ci joint la correction finale :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    ;with 
    CLD as
        (   select  distinct
                      year(DATE_MVT)   as  ANNEE
                    , month(DATE_MVT)  as  MOIS
            from    T_Mvt
            where   year(DATE_MVT) in (2017, 2018, 2019)
        )
    , MVT as
        (   select CLE_PIECE 
                 , year(DATE_MVT) as ANNEE
                 , month(DATE_MVT) as MOIS
    			 ,QTE
            from T_MVT mvt
            where mvt.qte < 0
                AND MVT.TYPE_MVT in (1, 3)
        )
    select  PCE.CODE
        ,   PCE.DESIGN
        ,   ISNULL(sum(MVT.QTE), 0) as [qté/mois]
        ,   CLD.MOIS as [mois]
        ,   CLD.ANNEE as [année]
    from    T_PIECE as  PCE 
        cross join CLD
        left join MVT 
            on  MVT.CLE_PIECE       = PCE.CLE_PIECE
            and MVT.ANNEE  = CLD.ANNEE
            and MVT.MOIS = CLD.MOIS
    group by PCE.CODE
        ,   PCE.DESIGN
        ,   CLD.MOIS
        ,   CLD.ANNEE
    order by    PCE.CODE,   CLD.ANNEE,   CLD.MOIS
    Merci à vous deux.

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

Discussions similaires

  1. [SQL] extraction des différences de 2 select
    Par toxine dans le forum Langage SQL
    Réponses: 8
    Dernier message: 12/08/2005, 13h27
  2. Analyseur XML : extraction des caracteres spéciaux
    Par abdou.sahraoui dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 19/07/2005, 15h07
  3. Probleme d'extraction des champs nuls
    Par ETOKA dans le forum SQL
    Réponses: 2
    Dernier message: 17/01/2005, 11h03
  4. Extraction des phrases d'un Texte
    Par LE CHAKAL dans le forum Langage
    Réponses: 6
    Dernier message: 19/08/2002, 21h23

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