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 :

Enlever doublon dans requête somme


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Enlever doublon dans requête somme
    bonjour

    je recherche de l aide sur cette requete.

    j ai deux tables:

    table1
    colis    article    qté 
    1    a    1 
    1    b    1 
    1    c    1 
    2    d    1
    table2
    colis    article    commentaires 
    1    a    vv 
    1    b    pp 
    1    c    mm 
    2    d    ll
    je fais cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT                            
     
    table1.colis,                            
    table1.article,                            
    table1.qté                            
    table2.commentaires                            
     
    FROM                            
     
    table1                            
     
    LEFT JOIN table2 on (table1.colis = table2.colis AND table1.article = table 2.article)
    et j obtiens:

    colis    article    commentaires    qté     
    1    a        1    vv 
    1    b        1    pp 
    1    c        1    mm 
    2    d        1    ll 
    1    a        1    vv 
    1    b        1    pp 
    1    c        1    mm 
    1    a        1    vv 
    1    b        1    pp 
    1    c        1    mm
    j'aimerais obtenir:

    colis    article    commentaires    qté  1    a        1    vv 
    1    b        1    pp 
    1    c        1    mm 
    2    d        1    ll
    Pouvez vous m'aider?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    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 244
    Points : 12 878
    Points
    12 878
    Par défaut
    Bonjour,
    DISTINCT permet de supprimer les doublons dans le résultat de la requête.
    Par contre vu les données que tu nous montres, la requête ne devrait pas renvoyer de doublons...

    Tatayo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    J ai du mal précisé mon cas, je vais le refaire avec les vrais données:

    j ai une table1 qui contient les champs/valeurs:
    colis/1
    article/a
    qté/10

    soit une ligne.

    j ai une table2 qui contient les champs/valeurs:
    colis/1/1
    article/a/a
    commentaires/vv/vv
    soit 2 lignes.

    Je veux afficher la qté pour le colis "1" et l'article "a" et le commentaire attachéL le resultat souhaité est donc:

    colis/1
    article/a
    qté/10
    commentaires/vv
    mais j'obtiens:

    colis/1
    article/a
    qté/40
    commentaires/vv
    ma requête est le 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
    18
    19
    20
    "
    SELECT
     
    table1.colis,
    table1.article,
    sum(table1.qté),
    t2.commentaires
     
    FROM
     
    table1
     
    left JOIN table2 AS t2 on table1.article = t2.article
    left JOIN table2 AS tt2 on table1.colis = tt2.colis
     
    group by
    table1.colis,
    table1.article,
    t2.commentaires
    "

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    bonjour,

    quelqu'un aurait une solution sur ce cas un peu special?

    merci
    Cedric

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Il y a des doublons (et donc une somme erronée) parce que tu as fait une double jointure sur la même table, alors que tu peux n'en faire qu'une seule :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT	 t1.Colis
    	,t1.Article
    	,SUM(t1.Quantite)
    	,t2.Commentaires
    FROM table1 AS t1
    	LEFT JOIN table2 AS t2 on t1.Article = t2.Article
    WHERE t1.Colis = t2.Colis
    GROUP BY t1.Colis, t1.Article, t2.Commentaires

    [EDIT] Un peu de lecture pour approfondir sur les jointures : http://sqlpro.developpez.com/cours/sqlaz/jointures/

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    merci, ça améliore mais ça ne marche pas entièrement, ça me donne encore des doublons avec une somme = a 20 au lieu de 10.

    par contre j ai trouvé la solution dans un tuto sur ce site, il faut mettre le distinct DANS la fonction sum.
    voici le code modifié qui marche ;-):

    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
     
    table1.colis,
    table1.article,
    sum(distinct table1.qté),
    t2.commentaires
     
    FROM
     
    table1
     
    left JOIN table2 AS t2 on table1.article = t2.article
    left JOIN table2 AS tt2 on table1.colis = tt2.colis
     
    group by
    table1.colis,
    table1.article,
    t2.commentaires;

    voici le lien du tuto: ftp://ftp-developpez.com/oracle/guide/SQL.pdf


    en tout cas merci pour les conseils ;-)
    ceci était un cas un peu simplifié je vais maintenant essayer sur la BDD de mon entreprise (SQL oracle).

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    En fait ce ne marche pas réellement :-(

    En effet, si dans ma table 1, j'ai deux lignes au lieu de une, ca ne marche pas.
    je m'explique:

    initialement, j avais:

    une table1 qui contient les champs/valeurs:
    colis/1
    article/a
    qté/10
    => si je splite cette qté de 1O en faisant deux lignes de 5, comme ceci:
    colis/1/1
    article/a/a
    qté/5/5
    alors la requête renvoie une qté totale de 5 et non de 10 comme attendu...
    Quelqu'un voit il le bug??
    merci

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    ça, ça marche...

    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
    SELECT
    table1.colis,
    table1.article,
    sum(table1.qté),
    tt2.commentaires
     
    FROM
     
    table1
     
    left JOIN (SELECT DISTINCT concat(table2.colis,table2.article) AS cc2,
     
                    table2.commentaires
                    FROM table2) AS tt2 
    ON concat(table1.colis,table1.article) = tt2.cc2
     
    GROUP BY
     
    table1.colis,
    table1.article,
    tt2.commentaires

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    et en essayant la requête de DotNetMatt, mais sans utiliser les "commentaires"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT	 t1.Colis
    	,t1.Article
    	,SUM(t1.Quantite)
    FROM table1 AS t1
    	LEFT JOIN table2 AS t2 ON t1.Article = t2.Article
    WHERE t1.Colis = t2.Colis
    GROUP BY t1.Colis, t1.Article
    et pense à utiliser les balises, SVP

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juin 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    je viens de l'essayer, ca ne marche pas, ca me donne une quantité de 20 au lieu de 10.

    merci

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    Mais au fait, pourquoi faire un LEFT JOIN au lieu de INNER JOIN ?

  12. #12
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Si la question s'adresse à moi, il n'y a pas de raison particulière, comme on n'a pas beaucoup de détails sur ce que souhaite faire cedriclv et qu'il est difficile d'y voir clair, c'était juste une proposition

    En tout cas c'est vraiment bizarre de faire la requête comme tu la fais cedriclv. Il n'y a pas besoin de faire une double jointure. Est-ce que tu pourrais poster le DDL de création des tables ? Peut-être aussi qu'expliquer un peu plus clairement ton cas nous aiderait :
    - Pourquoi as-tu deux lignes totalement identiques dans la table2 ?
    - Pourquoi utiliser un SUM alors qu'au final tu cherches juste à obtenir la valeur d'une ligne ?

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Votre DISTINCT sur le SUM risque d'avoir des effets de bords : si vous avez deux articles qui ont la même quantité, un seul sera comptabilisé, ce que vous avez visiblement remarqué

    Citation Envoyé par DotNetMatt Voir le message
    - Pourquoi as-tu deux lignes totalement identiques dans la table2 ?
    C'est effet la première question à se poser !

  14. #14
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Si la question s'adresse à moi, il n'y a pas de raison particulière, comme on n'a pas beaucoup de détails sur ce que souhaite faire cedriclv et qu'il est difficile d'y voir clair, c'était juste une proposition

    En tout cas c'est vraiment bizarre de faire la requête comme tu la fais cedriclv. Il n'y a pas besoin de faire une double jointure. Est-ce que tu pourrais poster le DDL de création des tables ? Peut-être aussi qu'expliquer un peu plus clairement ton cas nous aiderait :
    - Pourquoi as-tu deux lignes totalement identiques dans la table2 ?
    - Pourquoi utiliser un SUM alors qu'au final tu cherches juste à obtenir la valeur d'une ligne ?
    non, non bien sur

Discussions similaires

  1. [MySQL-5.1] Doublon dans requête
    Par cedriclv dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/06/2013, 01h46
  2. enlever doublon par requête ou sql
    Par marcmarc150 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 04/09/2010, 07h16
  3. doublon dans requête état de présences
    Par papagei2 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 06/02/2008, 13h38
  4. MySQL enlever doublons dans table
    Par MCSalsa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/06/2007, 21h18
  5. doublon dans requête
    Par zut94 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 31/08/2006, 15h13

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