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 :

Test d'égalité dans un group by


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut Test d'égalité dans un group by
    Bonjour,

    je cherche à faire une requête avec un group by.
    Pour un champ qui n'est pas dans le group by, je veux tester si toutes les valeurs du groupe sont identiques, si oui on renvoie cette valeur unique, si non on renvoie "%".

    Exemple :
    Ma table est
    ID CHAMP1 CHAMP2
    1 a x
    2 a x
    3 b y
    4 b z

    Ma requête group by CHAMP1 renverra :
    CHAMP1 CHAMP2
    a x
    b %

    Je ne sais pas trop comment faire ...
    Par avance, merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,


    la fonction count() peut aussi s'utiliser de cette manière : count(distinct ma_colonne)

    ceci associé avec une structure case when pour gérer le résultat d'affichage et c'est bon.

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Il faut que tu comptes le nombre total d'enregistrements présents dans la table pour :
    - Chaque CHAMPS1 distinct
    - Chaque CHAMPS1 et CHAMPS2 Distinct
    Puis tu compare les deux totaux.
    S'ils sont égaux alors tu n'as qu'un seul "type" d'enregistrements pour CHAMPS1 sinon tu en as plusieurs.

    Cela se traduit par la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT	DISTINCT chp1, DECODE(TOTAL, SOUS_TOTAL, chp2, '%')
    FROM	
    	(SELECT	chp1, chp2,
    		COUNT(chp2) OVER(PARTITION BY chp1) AS TOTAL,
    		COUNT(chp2) OVER(PARTITION BY chp1, chp2) AS SOUS_TOTAL
    	FROM	a)
    ;

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Plus simple avec min, max.. Si le min = max, alors c'est la même valeur de champ2, sinon on met %

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH a AS (SELECT 1 ID, 'a' champ1, 'x' champ2 FROM dual
    UNION ALL SELECT 2 ID, 'a' champ1, 'x' champ2 FROM dual
    UNION ALL SELECT 3 ID, 'b' champ1, 'y' champ2 FROM dual
    UNION ALL SELECT 4 ID, 'b' champ1, 'z' champ2 FROM dual)
    SELECT champ1, DECODE(MIN(champ2), MAX(champ2),MAX(champ2), '%') AS champ2
    FROM a
    group by champ1
     
    CHAMP1	CHAMP2
    a	x
    b	%

    Attention à la gestion des NULL. Ma requête n'en tient pas compte, la requête de Scriuiw ramène une ligne de plus.

  5. #5
    Membre averti
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    Merci beaucoup pour vos réponses !

    Je crois avoir optimisé un peu (en simplicité, peut-être pas en performances) la requête de Scriuiw et cela fonctionne comme je veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT champ1, DECODE(TOTAL, 1, champ2, '%')
    FROM	
    	(SELECT	champ1, champ2,
    		COUNT (distinct champ2) OVER(PARTITION BY champ1) AS TOTAL
    	FROM matable);
    Si jamais vous pensez que ce n'est pas équivalent merci de me le dire
    En attendant le mets le résolu.

    Bonne journée !

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    La problématique du NULL est toujours soulevée.
    En reprenant votre requête (bien vu le Distinct ) et le jeu de test suivant :

    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
    30
    31
    32
    33
    34
    35
    create table a 
      (id number(2), 
      ch1 varchar2(2), 
      ch2 varchar2(2));
     
    insert into a values (1,'a','x');
    insert into a values (2,'a','x');
    insert into a values (3,'a','x');
    insert into a values (4,'b','y');
    insert into a values (5,'b','x');
    insert into a values (6,'b','z');
    insert into a values (7,'c','i');
    insert into a values (8,'c','i');
    insert into a values (9,'d','j');
    insert into a values (10,'e','l');
    insert into a values (11,'e','m');
    insert into a values (12,'f','f');
    insert into a values (13,'f',NULL);
     
    SELECT DISTINCT ch1, DECODE(TOTAL, 1, ch2, '%'), TOTAL
    FROM 
     (SELECT ch1, ch2,
      COUNT (DISTINCT ch2) OVER(PARTITION BY ch1) AS TOTAL
     FROM a)
    ;
     
    CH DE
    -- --
    a  x    
    b  %    
    c  i    
    d  j    
    e  %    
    f  f    
    f
    La valeur NULL pour f scinde le résultat.
    Selon votre interprétation du NULL, il est possible d'y remédier avec par exemple la fonction COALESCE (J'ai considéré que le fait d'avoir un NULL suppose l’hétérogénéité des données en affectant le symbole % en cas de NULL)

    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
    SELECT DISTINCT ch1, DECODE(TOTAL, 1, ch2, '%'), TOTAL
    FROM	
    	(SELECT	ch1, ch2,
    		COUNT (DISTINCT COALESCE(ch2,'%')) OVER(PARTITION BY ch1) AS TOTAL
    	FROM a)
    ;
     
    CH D
    -- -
    a  x
    b  %
    c  i
    d  j
    e  %
    f  %

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    J'aime autant cette solution qui me paraît plus naturelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT champ1
           , case count(distinct champ2) when 1 then max(champ2) else '%' end as champ2
        FROM a
    GROUP BY champ1;

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

Discussions similaires

  1. Erreur dans un test d'égalité
    Par merry marie dans le forum Langage
    Réponses: 4
    Dernier message: 01/02/2013, 12h16
  2. Réponses: 2
    Dernier message: 13/04/2010, 14h57
  3. Réponses: 1
    Dernier message: 13/11/2007, 10h45
  4. Regrouper des champs dans un GROUP BY
    Par kaiserazo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 11/07/2005, 08h43
  5. GROUP_ID dans requete GROUP BY
    Par quemener dans le forum Oracle
    Réponses: 11
    Dernier message: 25/10/2004, 10h59

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