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 :

Problème de groupement


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 57
    Points
    57
    Par défaut Problème de groupement
    Bonjour a tous, j'ai un souci de requête

    Imaginons la requete suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select lib, sum(val)
    from table
    group by lib
    comment faire pour avoir une colonne de plus ayant sum(val) where lib=1 par exemple?
    J'aimerais éviter une sous requete si possible (car la mienne est bien plus grosse)

    J'ai essayé
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select t1.lib, sum(t1.val),sum(t2.val)
    from table t1, table t2
    where t2.lib=1
    group by t1.lib
    Mais les données sont fausses

    Merci d'avance

  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
    C'est la même solution que sur votre autre sujet, mais ce sera probablement plus compréhensible avec cette syntaxe allégée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select lib, sum(val) as val_all,
             sum(case lib when '1' then val else 0 end) as val_lib_1
        from matable
    group by lib

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    je ne sais si elle fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT lib, sum(tval),sum(decode(lib,1,tval,0))
    FROM TABLE 
    GROUP BY lib

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Waldar Voir le message
    C'est la même solution que sur votre autre sujet, mais ce sera probablement plus compréhensible avec cette syntaxe allégée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select lib, sum(val) as val_all,
             sum(case lib when '1' then val else 0 end) as val_lib_1
        from matable
    group by lib
    Non car admettons :
    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 lib, sum(val) AS val_all,
             sum(case lib when 'lib1' then val else 0 end) AS val_lib_1
     
    from (select 'lib1' lib, 1 val from dual
    UNION ALL
    select 'lib1' lib, 1 val from dual
    UNION ALL
    select 'lib1' lib, 1 val from dual
    UNION ALL
    select 'lib2' lib, 2 val from dual
    UNION ALL
    select 'lib2' lib, 2 val from dual
    UNION ALL
    select 'lib3' lib, 3 val from dual
    UNION ALL
    select 'lib5' lib, 5 val from dual)
    group by lib
    le resultat donne :

    LIB VAL_ALL VAL_LIB_1
    ---- ---------------------- ----------------------
    lib1 3 3
    lib2 4 0
    lib3 3 0
    lib5 5 0

    Au lieu de :
    LIB VAL_ALL VAL_LIB_1
    ---- ---------------------- ----------------------
    lib1 3 3
    lib2 4 3
    lib3 3 3
    lib5 5 3

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par teach Voir le message
    je ne sais si elle fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT lib, sum(tval),sum(decode(lib,1,tval,0))
    FROM TABLE 
    GROUP BY lib
    Non ca ne passe pas

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    la sous requête que tu ne veux pas alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT lib, sum(tval),(SELECT lib, sum(tval)
                                   FROM TABLE 
                                   where lib=1)  as SUM1
     
    FROM TABLE 
    GROUP BY lib,SUM1

  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
    Ah vous voulez propager l'information ?

    Je réfléchis à une solution analytique, mais pour le moment j'en n'en vois pas.
    Vous pouvez faire soit une requête scalaire, soit une sous-requête.
    Je préfère la seconde option :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      SELECT lib,
             sum(val) AS val_all,
             val_lib1
        FROM MaTable
             CROSS JOIN (select sum(val) as val_lib1
                           from MaTable
                          where lib = 'lib1')
    GROUP BY lib, val_lib1
    ORDER BY LIB ASC;

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    plutôt ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    SELECT lib, sum(tval),(SELECT sum(tval)
                                   FROM TABLE 
                                   WHERE lib=1)  AS SUM1
     
    FROM TABLE 
    GROUP BY lib,SUM1

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 57
    Points
    57
    Par défaut
    Ma requete va être horrible...
    Elle comporte déjà 3 union, il faudrait refaire 2 sous requêtes par union

  10. #10
    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'aurai du y penser plus tôt :
    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
    With MaTable AS
    (
    SELECT 'lib1' as lib, 1 as val FROM dual UNION ALL
    SELECT 'lib1'       , 1        FROM dual UNION ALL
    SELECT 'lib1'       , 1        FROM dual UNION ALL
    SELECT 'lib2'       , 2        FROM dual UNION ALL
    SELECT 'lib2'       , 2        FROM dual UNION ALL
    SELECT 'lib3'       , 3        FROM dual UNION ALL
    SELECT 'lib5'       , 5        FROM dual
    )
      SELECT lib,
             sum(val) AS val_all,
             max(case lib when 'lib1' then sum(val) end) over() as val1
        FROM MaTable
    GROUP BY lib
    ORDER BY LIB ASC;
     
    LIB	VAL_ALL	VAL1
    lib1	3	3
    lib2	4	3
    lib3	3	3
    lib5	5	3

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    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
    with Tab as (
    SELECT 'lib1' lib, 1 val FROM dual UNION ALL
    SELECT 'lib1' lib, 1 val FROM dual UNION ALL
    SELECT 'lib1' lib, 1 val FROM dual UNION ALL
    SELECT 'lib2' lib, 2 val FROM dual UNION ALL
    SELECT 'lib2' lib, 2 val FROM dual UNION ALL
    SELECT 'lib3' lib, 3 val FROM dual UNION ALL
    SELECT 'lib5' lib, 5 val FROM dual
    )
    SELECT lib, sum(val),
    (SELECT lib, sum(val)
            FROM Tab
            WHERE lib=1)  AS SUM1
    FROM Tab
    GROUP BY lib,SUM1
    ORA-00904: "SUM1": invalid identifier

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Points : 57
    Points
    57
    Par défaut
    Pas mal waldar! que veut dire le over() ?

  13. #13
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    En partant de ton exemple :
    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 lib, sum(val) AS val_all,
             sum(case lib when 'lib1' then sum(val) else 0 end) over () AS val_lib_1
    FROM (SELECT 'lib1' lib, 1 val FROM dual
    UNION ALL
    SELECT 'lib1' lib, 1 val FROM dual
    UNION ALL
    SELECT 'lib1' lib, 1 val FROM dual
    UNION ALL
    SELECT 'lib2' lib, 2 val FROM dual
    UNION ALL
    SELECT 'lib2' lib, 2 val FROM dual
    UNION ALL
    SELECT 'lib3' lib, 3 val FROM dual
    UNION ALL
    SELECT 'lib5' lib, 5 val FROM dual)
    GROUP BY lib

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

Discussions similaires

  1. Problème délicat groupement d'attributs
    Par rosyfulla dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/03/2013, 23h05
  2. problème de groupements
    Par Jasmine80 dans le forum Requêtes
    Réponses: 6
    Dernier message: 26/02/2009, 15h12
  3. Problème de groupement
    Par gescolino dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/01/2009, 21h05
  4. problème de groupement de javabeans
    Par chrisdev dans le forum iReport
    Réponses: 2
    Dernier message: 16/07/2007, 16h14
  5. problème de groupement des colonnes
    Par opeo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/09/2006, 16h35

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