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 :

problème de doublons


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 68
    Points
    68
    Par défaut problème de doublons
    Bonjour à tous,

    j'ai un problème de doublons, malgré que j'utilise la fonction distinct

    merci de votre aide

    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
     
    SELECT
        DISTINCT
        DONNEUR.ID,
        DONNEUR.NOM,
        SUM(DON.DON) AS DONNEE,
        SUM(PROMESSE.DON) AS A_DONNEE
    FROM DONNEUR
       LEFT OUTER JOIN PROMESSE  ON (DONNEUR.ID = PROMESSE.ID_DONNEUR)
       LEFT OUTER JOIN DON ON (PROMESSE.ID = DON.ID_PROMESSE)
       LEFT OUTER JOIN PROMESSE_ANNULER ON (PROMESSE.ID = PROMESSE_ANNULER.ID_PROMESSE)
    WHERE 
       (
          (PROMESSE.ID < 100)     
         AND
          (PROMESSE.ID NOT IN (SELECT ID_PROMESSE FROM PROMESSE_ANNULER))
     
       )
     
    GROUP BY DONNEUR.ID,DONNEUR.NOM, PROMESSE.DON
     
    HAVING
      (PROMESSE.DON > COALESCE( SUM (DON.DON),0))
    Images attachées Images attachées  

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il y a la requête, le modèle, il manque ce que vous voulez en faire, un jeu de données et le résultat attendu.
    En attendant, voici quelques corrections :
    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
        DONNEUR.ID,
        DONNEUR.NOM,
        SUM(COALESCE(DON.DON, 0)) AS DON,
        SUM(COALESCE(PROMESSE.DON, 0)) AS PROMESSE
    FROM
        DONNEUR
        LEFT OUTER JOIN PROMESSE
          ON PROMESSE.ID_DONNEUR = DONNEUR.ID
         AND PROMESSE.ID < 100
        LEFT OUTER JOIN DON
          ON DON.ID_PROMESSE = PROMESSE.ID
    WHERE 
        NOT EXISTS (SELECT NULL FROM PROMESSE_ANNULER
                    WHERE PROMESSE_ANNULER.ID_PROMESSE = PROMESSE.ID)
    GROUP BY
        DONNEUR.ID,
        DONNEUR.NOM
    HAVING
        SUM(COALESCE(PROMESSE.DON, 0)) > SUM(COALESCE(DON.DON, 0))

  3. #3
    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 803
    Points
    30 803
    Par défaut
    En plaçant PROMESSE.DON dans le GROUP BY, il peut en effet y avoitr des doublons.
    Ne connaissant pas les cardinalités, la requête pourrait ressembler à ça :
    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
    SELECT     dnr.id
        ,    dnr.nom
        ,    COALESCE(SUM(prm.donnee), 0)    AS donnee
        ,    COALESCE(SUM(prm.a_donnee), 0)    AS a_donnee
    FROM    donneur    AS dnr
        LEFT OUTER JOIN 
            (    SELECT    promesse.id_donneur
                    ,    dns.donnee            AS donnee
                    ,    SUM(promesse.don)     AS a_donnee
                FROM    promesse
                    LEFT OUTER JOIN 
                        (    SELECT    don.id_promesse
                                ,    SUM(don.don) AS donnee
                            FROM    don
                            GROUP BY don.id_promesse
                        )    AS dns
                        ON    promesse.id = dns.id_promesse
                WHERE    promesse.id < 100     
                    AND    promesse.id NOT IN 
                        (    SELECT    id_promesse 
                            FROM    promesse_annuler
                        )
                GROUP BY    promesse.id_donneur
                        ,    dns.donnee
            )    AS    prm 
            ON dnr.id =    prm.id_donneur
    GROUP BY    dnr.id
            ,    dnr.nom
    HAVING    COALESCE(SUM(prm.donnee), 0) > COALESCE(SUM(prm.a_donnee), 0)
    Edit : grilled
    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.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 68
    Points
    68
    Par défaut
    Merci Waldar
    pour ta réponse, le doublon a disparu mais la selection n'est pas correct.

    Merci al1_24
    pour ta réponse, j'ai testé ta requette, mais retour aucune valeur.


    voir fichier en pièce jointe (plus infos)

    merci
    Images attachées Images attachées  

  5. #5
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Citation Envoyé par medkyl Voir le message
    Merci Waldar
    pour ta réponse, le doublon a disparu mais la selection n'est pas correct.

    Merci al1_24
    pour ta réponse, j'ai testé ta requette, mais retour aucune valeur.
    Qu'est ce qui ne te convient pas dans la sélection de Waldar ?
    Elle est juste et ne te renvoie pas de doublon.

    Ou alors c'est que tu attends autre chose.

    ERE
    Quand une tête pense seule, elle devient folle.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 68
    Points
    68
    Par défaut
    merci emmanuel.remy de ta réponse.

    Avec le code de Waldar (ci-dessous) je n'ai pas le bon cumul, mais effectivement il n'y a plus de doublon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HAVING
        SUM(COALESCE(PROMESSE.DON, 0)) > SUM(COALESCE(DON.DON, 0))

    alors qu'il me faudrait ceci mais j'ai un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HAVING
        COALESCE(PROMESSE.DON, 0) > SUM(COALESCE(DON.DON, 0))
    mais après j'ai un message d'erreur de group by

    et si je rajoute le PROMESSE.DON au group by et là encore les doublons.

    Merci pour votre aide.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je plus simple serait de nous dire, en français, ce que vous attendez, car vous essayez de le dire en SQL mais vous le maîtrisez mal, et donc le message ne passe pas complètement.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 68
    Points
    68
    Par défaut
    Bonjour Waldar,

    Je reviens de congé, ce qui explique mon retard pour te répondre.
    Merci de te pencher sur mon problème.
    Je vais tacher de bien me faire comprendre.

    Pour vous expliquer en gros ma petite application dans l'entreprise ou je travail nous n'avons pas de comité d'entreprise, nous cotisons donc chacun pour les anniversaires, mariages, départ en retraite....

    Donc ce que je souhaite faire :

    mettre en place une petite application pour pouvoir gérer les promesses de dons de chacuns.

    Récupérer le nom des donneurs ainsi que leurs promesses qui n'ont pas été annulées et dont le montant n'a pas été du don est inférieur à sa promesse.
    exemple :
    Mr Jacques a fait une promesse de don de 5€
    Mr Jacques fait un don de 3€ et puis de 1€ il manque donc 1€
    Mr Jacques fait encore une promesse
    Comment faire ressortir les promesses des donneurs qui sont supérieures aux dons.

    Merci de ton aide...

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ah voilà une belle description de votre problème, merci c'est très précis.

    Deux remarques sur votre modèle.

    L'annulation d'une promesse je la modéliserai plutôt comme étant une caractéristique d'une promesse.

    De plus, je n'associerai pas le don à la promesse de don, mais plutôt au donneur. Si on vous promet dix euros mais qu'on vous en donne vingt, ce serait dommage que l'application le refuse !

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Si vous conservez malgré tout votre modélisation actuelle, il vous suffira je crois de reprendre la requête que vous a proposé Waldar, et d'inclure la promesse dans votre regroupement :
    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
    SELECT
        DONNEUR.ID,
        DONNEUR.NOM,
        PROMESSE.ID,
        COALESCE(PROMESSE.DON, 0) AS PROMESSE,
        SUM(COALESCE(DON.DON, 0)) AS DON
    FROM
        DONNEUR
        LEFT OUTER JOIN PROMESSE
          ON PROMESSE.ID_DONNEUR = DONNEUR.ID
         AND PROMESSE.ID < 100
        LEFT OUTER JOIN DON
          ON DON.ID_PROMESSE = PROMESSE.ID
    WHERE 
        NOT EXISTS (SELECT NULL FROM PROMESSE_ANNULER
                    WHERE PROMESSE_ANNULER.ID_PROMESSE = PROMESSE.ID)
    GROUP BY
        DONNEUR.ID,
        DONNEUR.NOM,
        PROMESSE.ID,
        COALESCE(PROMESSE.DON, 0)
    HAVING
        COALESCE(PROMESSE.DON, 0) > SUM(COALESCE(DON.DON, 0))

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    Merci à tous pour vos réponses.
    Désolé de vous répondre seulement maintenant, j'étais très chargé.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/08/2006, 23h35
  2. [WD10] Problème de doublons
    Par routmout dans le forum WinDev
    Réponses: 5
    Dernier message: 07/06/2006, 18h36
  3. Problème de doublons
    Par RapidJul dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/05/2006, 16h08
  4. Réponses: 7
    Dernier message: 30/01/2006, 21h36
  5. [access] Problème de doublons
    Par nesbla dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2005, 09h25

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