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 :

SUM(x distinct id)


Sujet :

Langage SQL

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut SUM(x distinct id)
    Bonjour,

    Je fais fasse à un problème très probablement tout bête, mais j'ai le cerveau en marmelade, j'arrive pas à trouver de solution simple...

    Je travaille avec Microsoft SQL Server 2016 (RTM-GDR) (KB4019088) - 13.0.1742.0 (X64) Jul 5 2017 23:41:17 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Standard 6.3 <X64> (Build 14393: ) (Hypervisor)

    Cependant je pense que la solution doit pouvoir se faire dans le SQL le plus standard qui soit.

    J'ai deux tables, l'une contient des doublons, et l'autre contient des valeurs.

    Je souhaite pouvoir calculer la somme des valeurs en dédoublonnant...

    En gros :

    Table CLIENT :

    id nom flag
    1 TOTO 0
    1 TOTO 1
    2 TITI 0
    3 TATA 1

    Table COMMANDE :

    CLIENT_ID TOTAL
    1 500
    1 250
    2 400
    2 300
    3 1000

    Et la requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select client.id, sum(commande.total)
    from client
    inner join commande on commande.client_id = client.id
    group by client.id

    Et c'est le drame : pour le client 1, j'ai 1500 au lieu de 750

    J'ai naïvement tenté de diviser par COUNT(client.id) mais dans ce cas ça divise par le nombre de lignes jointes, soit 4... donc j'obtiens la moyenne des commande...

    Et évidement COUNT(distinct client.id) ne ramène qu'un seul client par ligne donc j'ai le résultat initial.
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Hmpf, trouvé...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select client.id, sum(commande.total) / count(distinct client.flag)
    from client
    inner join commande on commande.client_id = client.id
    group by client.id

    "flag" étant la colonne qui provoque les doublons... suffit de diviser par les valeurs retournées... bon, après faudrait pas que j'ai deux fois le même flag pour le même client, mais dans mon cas ça ne peut pas arriver.
    On ne jouit bien que de ce qu’on partage.

  3. #3
    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
    J'ai encore mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select client_id
           , sum(total)
        from commande 
    group by client_id;

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Oui, sauf que je ne veux que les "commandes" qui ont leur client_id présent dans "client" suivant un filtre.

    J'ai un peu trop simplifié mon exemple

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select client.id, sum(commande.total) / count(distinct client.flag)
    from client
    inner join commande on commande.client_id = client.id
    where client.age_du_capitaine = 42
    group by client.id

    Après je pourrais faire un where commande.client_id in (select id from client where age_du_capitaine = 42) pourquoi pas...
    Pas sûr que ce soit bien lisible au final.

    D'ailleurs, question existentielle...

    Si j'ai des doublons dans "ori", est-ce que ça change quelque chose si j'utilise distinct ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    where id in (select id from ori)
    -- ou bien
    where id in (select distinct id from ori)

    Est-ce que ça change quelque chose ? Si oui dans quel sens ? Genre, le distinct est coûteux, est-ce qu'il apporte quelque chose ou au contraire est plus lourd que de faire un IN sur des doublons ?
    On ne jouit bien que de ce qu’on partage.

  5. #5
    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
    Citation Envoyé par StringBuilder Voir le message
    J'ai un peu trop simplifié mon exemple
    On fait la somme avant la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with cte_commande_par_client (client_id, total) as
    (
      select client_id
           , sum(total)
        from commande 
    group by client_id
    )
    select cli.id, cmd.total
      from client       as cli
      join cte_commande as cmd on cmd.client_id = cli.id
     where cli.age_du_capitaine = 42;
    Ou si vraiment les filtres sur les clients sont très restrictifs, un CROSS APPLY ferait bien le travail (là je sens que je n'ai pas besoin d'expliquer).

    Citation Envoyé par StringBuilder Voir le message
    Si j'ai des doublons dans "ori", est-ce que ça change quelque chose si j'utilise distinct ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    where id in (select id from ori)
    -- ou bien
    where id in (select distinct id from ori)
    Rien du tout, comme le IN est une succession de OR, même si ID présente des doublons ça ne change rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ID = 1 OR ID = 1 OR ID = 1 ...
    Certains optimiseurs font un distinct de manière implicite, d'autres simplifient la succession de OR en un seul quand il y a les doublons.

    Pas la peine de l'écrire en tout cas.

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

Discussions similaires

  1. SUM et Distinct
    Par cisco59 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/12/2017, 20h37
  2. requete avec sum if distinct
    Par bourvil dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/05/2010, 14h35
  3. problème avec SUM(Distinct champ_x) sur base access
    Par walid_kerkoub dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/09/2009, 16h14
  4. Utilisation de "sum" et "distinct"
    Par guyanais dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/05/2009, 20h15
  5. SUM de tout les éléments distinct
    Par gomodo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/01/2008, 21h25

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