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 :

Requête Agrégation [2014]


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut Requête Agrégation
    Bonjour à tous,

    j'ai un problème tout bête avec une requête.

    j'ai 3 tables :

    PIECES. avec la clé ID
    PIECES_EQUIPEMENT , ID_PIECE (FK) , ID_EQUIPEMENT (FK), NOMBRE => il peut y avoir plusieurs ID_PIECE identique pour un même ID_EQUIPEMENT
    PIECES_MAGASIN (ID_PIECE)

    quand j’exécute cette requête, mon NbPieccesMagasin est faux. Pourtant j'ai une relation 1-1 entre la table PIECES même si j'ai une relation 1-n entre PIECES et PIECES_EQUIPEMENT je devrais avoir sum(coalesce(PIECES_MAGASIN.NB_STOCK,0)) as NbPiecesMagasins qui fait la somme en fonction du ID de ma table PIECES ? quelque chose m'échappe....

    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 PIECES.ID as ID_PIECE,   REFERENCE,
                              COUT,
                              DESCRIPTION,
                              CODE_ARTICLE,
    			  sum(coalesce(PIECES_EQUIPEMENT.NOMBRE,0)) as NbPiecesSite,
           		          sum(coalesce(PIECES_MAGASIN.NB_STOCK,0)) as NbPiecesMagasins 
                        from  PIECES 
                             left join PIECES_EQUIPEMENT on PIECES.ID = PIECES_EQUIPEMENT.ID_PIECE
    			 left join PIECES_MAGASIN on PIECES.ID = PIECES_MAGASIN.ID_PIECE
     
    						         group by PIECES.ID,   REFERENCE,
                              COUT,
                              DESCRIPTION,
     
     
                     order by ID_PIECE

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Bonjour,

    La meilleure manière de déboguer une requête d'agrégation est d'afficher le détail des données sans les regrouper.
    Cela permet d'identifier les valeurs qui seront réellement utilisées dans l'agrégation.

    Ce qui serait intéressant, c'est de qualifier tes colonnes, c'est à dire ajouter le nom de table (ou son alias) avant le nom de chaque colonne, ce qui permet de bien identifier d'où proviennent les données.

    Si tu as des relations 1-1 ou 1-n entre tes tables, pourquoi utiliser des jointures externes ?
    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 du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Merci pour ta réponse.

    relation 0.n pardon. donc comme je ne suis pas sure que la pièce soit dans les autres tables, je fais une jointure externe,
    j'ai affiché le résultat, un par un.
    Dans cette première requete : le "NbPieceMagasins" doit etre 4 (comme le montre la dernière requete) et non 124. ci dessous les requete avec 1 jointeur par agregation.

    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
     
    select PIECES.ID as ID_PIECE,REFERENCE,
    COUT,
    CODE_ARTICLE,
    ID_FOURNISSEURS,
    ID_FICHIERS,   
    sum(coalesce(PIECES_EQUIPEMENT.NOMBRE,0)) as NbPiecesSite,
    sum(coalesce(PIECES_MAGASIN.NB_STOCK,0)) as NbPiecesMagasins ,C.TYPE
    from  PIECES 
        left join PIECES_EQUIPEMENT on PIECES.ID = PIECES_EQUIPEMENT.ID_PIECE
    	left join PIECES_MAGASIN on PIECES.ID = PIECES_MAGASIN.ID_PIECE
        left join PIECES_FAM_SFAM c on c.FAMILLE = PIECES.FAMILLE and c.SS_FAMILLE = PIECES.SS_FAMILLE
      where PIECES.ID = 12     
    group by PIECES_MAGASIN.ID_PIECE,PIECES.ID,   REFERENCE,
        COUT,
        CODE_ARTICLE,
        ID_FOURNISSEURS,ID_FICHIERS,C.TYPE
     
    order by ID_PIECE
    Nom : 2021-06-08_15h18_41.png
Affichages : 60
Taille : 5,0 Ko
    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
     
    select PIECES.ID as ID_PIECE,REFERENCE,
    COUT,
    CODE_ARTICLE,
     
    sum(coalesce(PIECES_EQUIPEMENT.NOMBRE,0)) as NbPiecesSite
     
    from  PIECES 
        left join PIECES_EQUIPEMENT on PIECES.ID = PIECES_EQUIPEMENT.ID_PIECE
     
      where PIECES.ID = 12     
    group by PIECES.ID,   REFERENCE,
        COUT,
        CODE_ARTICLE
     
    order by ID_PIECE
    Nom : 2021-06-08_15h20_48.png
Affichages : 61
Taille : 3,8 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select PIECES.ID as ID_PIECE,REFERENCE,
    COUT,
    CODE_ARTICLE,
    sum(coalesce(PIECES_MAGASIN.NB_STOCK,0)) as NbPiecesMagasins 
    from  PIECES 
     
    	left join PIECES_MAGASIN on PIECES.ID = PIECES_MAGASIN.ID_PIECE
      where PIECES.ID = 12     
    group by PIECES_MAGASIN.ID_PIECE,PIECES.ID,   REFERENCE,
        COUT,
        CODE_ARTICLE
     
    order by ID_PIECE
    Nom : 2021-06-08_15h22_54.png
Affichages : 57
Taille : 3,9 Ko

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    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 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Dans la première requête il y a une différence entre la liste des colonnes présentes dans la clause SELECT et celle de la clause GROUP BY:
    Dans le SELECT:
    PIECES.ID,
    REFERENCE,
    COUT,
    CODE_ARTICLE,
    ID_FOURNISSEURS,
    ID_FICHIERS
    Dans le GROUP BY:
    PIECES_MAGASIN.ID_PIECE,
    PIECES.ID,
    REFERENCE,
    COUT,
    CODE_ARTICLE,
    ID_FOURNISSEURS,
    ID_FICHIERS,
    C.TYPE

    Ca peut expliquer les écarts que tu constates entre ce que tu veux et ce que la requête renvoie.

    Tatayo.

  5. #5
    Membre du Club
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2018
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2018
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Merci. mais non, je viens de tenter en mettant les mêmes choses dans le group by.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    La meilleure manière de déboguer une requête d'agrégation est d'afficher le détail des données sans les regrouper.
    Cela permet d'identifier les valeurs qui seront réellement utilisées dans l'agrégation.
    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.

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

Discussions similaires

  1. Requête agrégation deux fois sur la même table
    Par Paul TOTH dans le forum SQL
    Réponses: 6
    Dernier message: 25/06/2019, 12h13
  2. Problème de requête agrégat
    Par revilo40 dans le forum Paradox
    Réponses: 3
    Dernier message: 11/07/2017, 21h57
  3. [AC-2007] [Requête] Agrégat et date ne font pas bon ménage.
    Par Kaley dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/07/2013, 09h00
  4. Requêtes agrégat MAX
    Par amelieo dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/01/2007, 10h30
  5. [requête] agrégat Count
    Par laurent.w dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 30/12/2006, 06h27

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