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

SQL Oracle Discussion :

Faire la somme d'une colonne dans la même requête


Sujet :

SQL Oracle

  1. #1
    Membre du Club Avatar de logiciel_const
    Inscrit en
    Octobre 2007
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 167
    Points : 64
    Points
    64
    Par défaut Faire la somme d'une colonne dans la même requête
    bonjour,
    la table suivante contient des doublants, alors que moi je veux faire la somme de la colenne val, mais sans faire de répétitions par exemple pour l'id 1000199 on ne prend qu'une seule fois la valeur 9882,73
    ,et meme chose pour l'id 1000160.
    merci de m'aider àtrouver le sql adéquat.
    Images attachées Images attachées  

  2. #2
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 132
    Points
    132
    Par défaut
    avec un select sum(distinct val)?
    quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT product_id, sum(distinct val) FROM products group by p_id;

  3. #3
    Membre du Club Avatar de logiciel_const
    Inscrit en
    Octobre 2007
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 167
    Points : 64
    Points
    64
    Par défaut
    merci pour votre réponse, c'est ce que j'ai essayé,mais dans le cas ou il ya par exemple des produits qui ont des id différents mais meme quantité il ne choisit qu'une seule quantité!!

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Points : 126
    Points
    126
    Par défaut
    bonjour,

    vous pouvez essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select T.Product_id, sum(T.val) From 
    (SELECT product_id, max(val) val FROM products GROUP BY p_id) T;

  5. #5
    Membre du Club Avatar de logiciel_const
    Inscrit en
    Octobre 2007
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 167
    Points : 64
    Points
    64
    Par défaut
    pour mieux expliquer les choses:
    par exemple por l'id 1000199 prendre une suele fois la valeur 9882,73
    ,ensuite pour id 1000166 prendre la valeur, 0 t ainsi de suite .....pour l'id 1000161prendre seulement une fois 1415,35 ................
    et faire la somme totale, donc on aura pas de besoin de selectionner l'id.

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
    WITH t AS (SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 1 ID, 7 val FROM dual
    UNION ALL SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 2 ID, 0 val FROM dual
    UNION ALL SELECT 3 ID, 8 val FROM dual
    UNION ALL SELECT 3 ID, 12 val FROM dual
    )
    SELECT ID, SUM(val)
    FROM (
          SELECT ID, val
          FROM t
          GROUP BY ID, val
          )
    GROUP BY ID
     
    ID	SUM(VAL)
    1	15
    2	0
    3	20
    Par contre, j'ai le même résultat avec le sum(distinct)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH t AS (SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 1 ID, 7 val FROM dual
    UNION ALL SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 2 ID, 0 val FROM dual
    UNION ALL SELECT 3 ID, 8 val FROM dual
    UNION ALL SELECT 3 ID, 12 val FROM dual
    )
    SELECT ID, SUM(DISTINCT val)
    FROM  t
    GROUP BY ID
    ID	SUM(DISTINCTVAL)
    1	15
    2	0
    3	20
    donc je ne comprends pas ta réponse
    merci pour votre réponse, c'est ce que j'ai essayé,mais dans le cas ou il ya par exemple des produits qui ont des id différents mais meme quantité il ne choisit qu'une seule quantité!!
    Peux tu donner un exemple ?

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par logiciel_const Voir le message
    pour mieux expliquer les choses:
    ...et faire la somme totale, donc on aura pas de besoin de selectionner l'id.
    Tu veux faire la somme totale ?

    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
    WITH t AS (SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 1 ID, 7 val FROM dual
    UNION ALL SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 2 ID, 0 val FROM dual
    UNION ALL SELECT 3 ID, 8 val FROM dual
    UNION ALL SELECT 3 ID, 12 val FROM dual
    )
    SELECT SUM(val)
    FROM (
      SELECT ID, SUM(DISTINCT val) val
      FROM  t
      GROUP BY ID
    )
     
    SUM(VAL)
    35

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 60
    Points
    60
    Par défaut
    La requete suivant fonctionne egalement :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH t AS (SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 1 ID, 7 val FROM dual
    UNION ALL SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 2 ID, 0 val FROM dual
    UNION ALL SELECT 3 ID, 8 val FROM dual
    UNION ALL SELECT 3 ID, 12 val FROM dual
    )
      SELECT sum(SUM(DISTINCT val)) val
      FROM  t
      GROUP BY ID

  9. #9
    Membre du Club Avatar de logiciel_const
    Inscrit en
    Octobre 2007
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 167
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par McM Voir le message
    Tu veux faire la somme totale ?

    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
    WITH t AS (SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 1 ID, 7 val FROM dual
    UNION ALL SELECT 1 ID, 8 val FROM dual
    UNION ALL SELECT 2 ID, 0 val FROM dual
    UNION ALL SELECT 3 ID, 8 val FROM dual
    UNION ALL SELECT 3 ID, 12 val FROM dual
    )
    SELECT SUM(val)
    FROM (
      SELECT ID, SUM(DISTINCT val) val
      FROM  t
      GROUP BY ID
    )
     
    SUM(VAL)
    35
    merci pour votre réponse,
    remarque que vous avez par exemple mis por le meme id différentes val, alors que dans mon cas :meme id meme val.
    je crois que j'ai trouvé la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select sum (ValD) as val
    from( 
    select DISTINCT id,sum(val) as ValD from product)

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    1/ Ta requête est fausse et sort en erreur.
    2/ Donne un exemple de données et du résultat attendu, parce que l'énoncé dit :
    La table suivante contient des doublants, alors que moi je veux faire la somme de la colenne val, mais sans faire de répétitions par exemple pour l'id 1000199 on ne prend qu'une seule fois la valeur 9882,73
    ,et meme chose pour l'id 1000160.
    C'est exactement ce qu'on a donné comme requête.

  11. #11
    Membre du Club Avatar de logiciel_const
    Inscrit en
    Octobre 2007
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 167
    Points : 64
    Points
    64
    Par défaut
    voici une petite description de ce que j'attends comme résultat:
    Images attachées Images attachées  

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 60
    Points
    60
    Par défaut
    Et c'est exactement ce que notre solution execute ... Pour te convaincre, voila la requete avec la meme table que celle fournie :

    Code sql : 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
    WITH t AS (SELECT 1000199 ID, 9882.73 val FROM dual
    UNION ALL SELECT 1000199 ID, 9882.73 val FROM dual
    UNION ALL SELECT 1000199 ID, 9882.73 val FROM dual
    UNION ALL SELECT 1000166 ID, 0 val FROM dual
    UNION ALL SELECT 1000172 ID, 0 val FROM dual
    UNION ALL SELECT 1000178 ID, 0 val FROM dual
    UNION ALL SELECT 1000161 ID, 1415.35 val FROM dual
    UNION ALL SELECT 1000161 ID, 1415.35 val FROM dual 
    UNION ALL SELECT 1000168 ID, 0.03 val FROM dual 
    UNION ALL SELECT 1000181 ID, 0 val FROM dual 
    UNION ALL SELECT 1000159 ID, 3703.52 val FROM dual 
    UNION ALL SELECT 1000160 ID, 235.26 val FROM dual  
    UNION ALL SELECT 1000160 ID, 235.26 val FROM dual 
    ) 
      SELECT sum(SUM(DISTINCT val)) val
      FROM  t
      GROUP BY ID

    Edit : Et juste par curiosite, pourrais tu donner le contexte d'une telle requette ?

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Euh... non, ça ne marche que lorsqu'on a la chance de ne pas avoir 2 fois la meme VAL pour 2 id différent (essaye un cas ou il y a plusieurs fois la meme valeur de VAL dans des id différents, et tu verras...) Faut donc prendre la requête de MCM.

    Mais la question qui se pose à présent et: pourquoi se retrouve-t-on avec des vilains doublons dans ce tableau!

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 60
    Points
    60
    Par défaut
    Je crois que cela fonctionne meme si on retrouve des valeurs identiques pour deux ID differents :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SET ECHO ON ;
    WITH tbl AS
    ( SELECT 1 ID, 100 valeur FROM dual UNION ALL
      SELECT 1 ID, 100 valeur FROM dual UNION ALL
      SELECT 2 ID, 100 valeur FROM dual UNION ALL
      SELECT 3 ID, 100 valeur FROM dual UNION ALL
      SELECT 3 ID, 100 valeur FROM dual  )
    SELECT sum(sum(DISTINCT valeur)) val FROM tbl GROUP BY ID ;
     
           VAL
    ----------
           300

    Par contre je te rejoins sur la question de savoir pourquoi on se retrouve avec des doublons. D'ou ma requete d'avoir un peu de contexte.

  15. #15
    Membre du Club Avatar de logiciel_const
    Inscrit en
    Octobre 2007
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 167
    Points : 64
    Points
    64
    Par défaut
    @ remi4444 : c'est ce que j'ai pensé à premiere vu, j'ai fais des tests et
    Jorafali a entierement raison,moi j'ai cru que distinct va prendre une seule fois une valeur répétée,pour différents id.
    @Jorafali: cette requete a pour but de faire le montant total des produits . y a des doublants parce ce que ce tableau est le résultat d'une jointure.
    merci à tous

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Citation Envoyé par logiciel_const Voir le message
    cette requete a pour but de faire le montant total des produits . y a des doublants parce ce tableau est le résultat d'une jointure.
    Ça ce n'est pas normal non plus, soit votre requête qui fait la jointure est fausse, soit votre modélisation est bancale, soit les deux.

    Enfin c'est un autre sujet.

  17. #17
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Au temps pour moi, certes ça fonctionne mais par une règle implicite oracle pas forcément intuitive à savoir que le group-by porte sur le plus profond de la parenthèse. La requête fait donc un dédoublonnage implicite... d'ailleurs ça va marcher aussi si on fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH tbl AS
    ( SELECT 1 ID, 100 valeur FROM dual UNION ALL
      SELECT 1 ID, 100 valeur FROM dual UNION ALL
      SELECT 2 ID, 100 valeur FROM dual UNION ALL
      SELECT 3 ID, 100 valeur FROM dual UNION ALL
      SELECT 3 ID, 100 valeur FROM dual  )
    SELECT sum(min(valeur)) val FROM tbl GROUP BY ID ;
    Mais franchement je trouve que c'est un peu plus simple de se dire:
    1- on dédoublonne
    2- on fait la somme

    c'est à dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH t AS
    ( SELECT 1 ID, 100 valeur FROM dual UNION ALL
      SELECT 1 ID, 100 valeur FROM dual UNION ALL
      SELECT 2 ID, 100 valeur FROM dual UNION ALL
      SELECT 3 ID, 100 valeur FROM dual UNION ALL
      SELECT 3 ID, 100 valeur FROM dual 
    ) 
    SELECT /* somme */ sum(valeur) from 
    (
      select /* dedoublonnage */ DISTINCT id,valeur  FROM t
    )
    Enfin bon, perso je préfère les truc 1ier degré que les règles implicites (je ne m'en souvenais même pas de celle là lol)

  18. #18
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Citation Envoyé par remi4444 Voir le message
    Au temps pour moi, certes ça fonctionne mais par une règle implicite oracle pas forcément intuitive à savoir que le group-by porte sur le plus profond de la parenthèse. La requête fait donc un dédoublonnage implicite...
    Ce n'est pas une règle implicite, c'est documenté :
    http://download.oracle.com/docs/cd/E...htm#SQLRF20035

    Citation Envoyé par Oracle
    You can nest aggregate functions. For example, the following example calculates the average of the maximum salaries of all the departments in the sample schema hr:

    SELECT AVG(MAX(salary))
    FROM employees
    GROUP BY department_id;

    AVG(MAX(SALARY))
    ----------------
    10926.3333

    This calculation evaluates the inner aggregate (MAX(salary)) for each group defined by the GROUP BY clause (department_id), and aggregates the results again.
    J'en parlais récemment chez nos amis de SQL-Server :
    http://www.developpez.net/forums/d98...ser-count-min/

    Citation Envoyé par Waldar Voir le message
    C'est une facilité d'écriture qui fait exactement la même chose que votre première requête.

    L'agrégat interne prend en compte le group by, l'agrégat externe tout ce résultat.

    C'est très peu utilisé, car d'une part méconnu et d'autre part ça prête plus à confusion qu'autre chose.

    Au niveau du plan d'exécution on économise juste l'étape de la création de la vue imbriquée.
    Citation Envoyé par remi4444 Voir le message
    d'ailleurs ça va marcher aussi si on fait
    Pas nécessairement, ça dépend de ce que veut l'auteur et de ses données.
    Si pour un même ID il y a deux valeurs distinctes, le sum(distinct) va bien faire l'addition des deux, le min() ne va conserver que la plus petite.

    Si pour chaque id les valeurs sont distinctes, alors on obtient le même résultat, mais encore une fois ce sont les données qui feront que le résultat est similaire, pas la requête.

  19. #19
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    @Waldar

    Tu dis toi meme que c'est peu utilisé et que ça peut prêter à confusion. Je me suis peut être mal exprimé mais je ne voulais pas dire autre chose.

    Appliquer telle que la requête de Jorafali, j'ai peur que ça fasse un peu: "ça marche mais je sais pas pourquoi ça marche" le genre de chose qui promet à coup sur des anomalies à la prochaine évol qui introduira la petite différence qui tue...

    D'ailleurs, ayant moi même pas mal pratiqué le SQL durant quelques années,je me suis planté sur une première lecture de cette requête... La raison est que le group by étant à l'extérieur de la parenthèse peut donner l'impression de s'appliquer au niveau supérieur alors qu'il s'applique au contraire à l'agrégat le plus profond de la parenthèse. Certes, en réfléchissant et en se référant à la doc oracle on peu conclure que c'est finalement logique mais pour moi, c'est pas super intuitif!

  20. #20
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tout à fait d'accord.
    Pour moi, ça a beau être dans la doc, je trouve que ça prête à confusion.
    C'est un peu comme de ne pas mettre de () dans des conditions OR et AND
    A la relecture (ou en débug), tu es obligé de faire un test pour être sur à 100% que ça ne vient pas de là.

    Enfin, pour en revenir au sujet du post, je n'ai pas réussi à comprendre : c'est résolu ou pas ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment obtenir la somme d'une colonne dans Listview
    Par Jonathan31 dans le forum VB.NET
    Réponses: 1
    Dernier message: 04/01/2011, 11h46
  2. Réponses: 3
    Dernier message: 26/02/2010, 11h18
  3. Faire la somme d'une colonne
    Par vg-matrix dans le forum Rave
    Réponses: 1
    Dernier message: 02/11/2009, 15h28
  4. faire la somme d'une colonne ou il y a des chifres et du texte
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/07/2008, 14h28
  5. faire la somme d'une colonne d'une listbox
    Par Namson dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 25/04/2007, 23h34

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