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 :

Afficher que les champs qui apparaissent plusieurs fois


Sujet :

Langage SQL

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut Afficher que les champs qui apparaissent plusieurs fois
    Bonjour lorsque je fais cette requête simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * FROM TF_DSI_STOGRP where DSI_STOGRP_DEXTRACT='2021-02-04' and DSI_STOGRP_VOLUME='ZSHR01'
    cela m'affcihe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Colonne PART    Colonne disque
     
    Z013                 ZSHR01
    CPU1                 ZSHR01
    C022                 ZSHR01
    Il n'y a que certains disques qui s'affiche plusieurs fois (plus d'une fois).

    J'aimerais faire une requête plus générale (sans cibler le disque ZSHR01) et afficher tous les disque qui correspondent à plusieurs valeur de la colonne PART

    J'ai fait la requête suivante qui ne fonctionne pas..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DSI_STOGRP_SYSNAME, DSI_STOGRP_VOLUME
        FROM TF_DSI_STOGRP where DSI_STOGRP_DEXTRACT='2021-02-04'
        GROUP BY DSI_STOGRP_VOLUME, DSI_STOGRP_SYSNAME
        HAVING COUNT(*) > 1
    Qu'est-ce qui ne va pas dans ma requête ?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    D'après ton jeu de test, toutes les lignes sont différentes (voir la première colonne).
    Comme tu regroupes sur les deux colonnes, ce regroupement ne sert à rien.
    Si tu enlèves la première colonne, ou que tu utilises une fonction d'agrégation (min, max...) et que tu l'enlèves du group by, tu auras alors le "bon" décompte.

    Tatayo.

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Salut, cette requête se rapproche de ce que je souhaite mais il faudrait que j'affiche en plus les différentes valeurs de PART correspondante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DSI_STOGRP_VOLUME FROM TF_DSI_STOGRP where DSI_STOGRP_DEXTRACT='2021-02-04'
    GROUP BY DSI_STOGRP_VOLUME
    HAVING COUNT(*) > 1
    Avec cela, j'obtiens une liste d'une seule colonne des disques qui apparaissent plusieurs fois.

    Il me reste à afficher en face les valeur de PART comme sur mon premier jeu de test.

    J'ai fait ça mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DSI_STOGRP_VOLUME, DSI_STOGRP_SYSNAME FROM TF_DSI_STOGRP where DSI_STOGRP_DEXTRACT='2021-02-04'
    GROUP BY DSI_STOGRP_VOLUME, DSI_STOGRP_SYSNAME
    HAVING COUNT(*) > 1
    J'obtiens ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DSI_STOGRP_VOLUME         DSI_STOGRP_SYSNAME    
     
    DPRP06                             C022 
    DPRP10                             C022
    DPRP01                             C022
    DPRP04                             C022
    DPRP09                             C022
    DPRP02                             C022
    DPRP05                             C022
    DPRP03                             C022

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Le mieux ici serait de nous donner la description exacte des tables, un jeu de test et le résultat attendu.
    Car là d'un exemple à l'autre le nom des colonnes et leur contenu change à chaque fois, c'est du coup un peu difficile à suivre.
    Sinon à vue de nez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.col1,count(distinct col2)
    from LaTable t1
    group by col1
    having count(distinct col2) > 1
    Ca devrait se rapprocher ce que tu cherches. Toutes les valeurs de col1 pour lesquelles il existe plusieurs valeurs distinctes de col2.

    Tatayo.

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Salut tatayo et merci pour ton aide.
    En fait ta requête ne me donne pas exactement ce que je souhaite. Elle me donne le nombre de fois où le champs DSI_STOGRP_VOLUME apparaît mais pas les valeurs.
    Tu as en pièce jointe ce que me donne ta requête.
    j'ai aussi mis en pièce jointe le résultat d'une requête simple pour montrer ce que contient la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DSI_STOGRP_VOLUME, DSI_STOGRP_SYSNAME FROM TF_DSI_STOGRP where DSI_STOGRP_DEXTRACT='2021-02-04' order by DSI_STOGRP_VOLUME desc
    La troisième photos donne le résultat de ce que je souhaite, à savoir, afficher uniquement les champs qui correspondent à plusieurs valeurs différentes de
    DSI_STOGRP_VOLUME avec les différentes valeurs en face
    Images attachées Images attachées    

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Effectivement, c'est plus clair avec un exemple concret.
    Peut-être avec ce genre de requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct 1.*
    from LaTable as t1
    inner join LaTable as t2 on t1.col1 = t2.col1 and t1.col2 <> t2.col2
    La requête cherche pour chaque ligne de la table s'il en existe un autre avec ma même valeur pour col1, mais une valeur différente pour col2.
    Il faut un distinct sinon chaque ligne apparaitra autant de fois (-1) qu'elle aura de "correspondant".

    Tatayo.

  7. #7
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Salut Tatayo,

    j'ai un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct 1.*
    from TF_DSI_STOGRP as t1
    inner join TF_DSI_STOGRP as t2 on t1.DSI_STOGRP_VOLUME = t2.DSI_STOGRP_VOLUME and t1.DSI_STOGRP_SYSNAME <> t2.DSI_STOGRP_SYSNAME
    Images attachées Images attachées  

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Oups, une petite faute de frappe dans le SELECT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct 1.* => select t1.*
    from TF_DSI_STOGRP as t1
    inner join TF_DSI_STOGRP as t2 on t1.DSI_STOGRP_VOLUME = t2.DSI_STOGRP_VOLUME and t1.DSI_STOGRP_SYSNAME <> t2.DSI_STOGRP_SYSNAME
    Tatayo.

  9. #9
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    On y est presque mais j'ai des données unique qui ne devraient pas apparaîtrent : WREO18, WREO17, WREO16 etc...
    Ils n'ont qu'une seule correspondance dans la colonne : DSI_STOGRP_SYSNAME

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select distinct t1.DSI_STOGRP_VOLUME, t1.DSI_STOGRP_SYSNAME
    from TF_DSI_STOGRP as t1
    inner join TF_DSI_STOGRP as t2 on t1.DSI_STOGRP_VOLUME = t2.DSI_STOGRP_VOLUME and t1.DSI_STOGRP_SYSNAME <> t2.DSI_STOGRP_SYSNAME
    where t1.DSI_STOGRP_DEXTRACT='2021-02-04' and t1.DSI_STOGRP_VOLUME <> 'CL%'
    order by t1.DSI_STOGRP_VOLUME desc
    Images attachées Images attachées  

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    J'avoue que je ne vois pas.
    Peut-être qu'en ajoutant les colonnes correspondantes de t2 dans le SELECT, on aura une piste...

    Tatayo.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Je pense que j'ai trouvé l'origine du problème.
    Tu filtres t1 sur la date, mais pas t2.
    Donc tu peux avoir deux lignes (disons L1 et L2), qui ont la même valeur pour DSI_STOGRP_VOLUME, une valeur différente pour DSI_STOGRP_SYSNAME (c'est ce qu'on cherche), mais seule L1 a pour DSI_STOGRP_DEXTRACT la valeur '2021-02-04'.
    Donc L1 est bien renvoyée (puisqu'on trouve bien L2), mais pas L2 car elle ne vérifie pas la condition DSI_STOGRP_DEXTRACT = '2021-02-04'.
    Il faut donc appliquer les mêmes filtres pour les deux alias.

    Tatayo.

  12. #12
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Salut Tatayo.
    Je refais la requête demain.
    Je vous tiens au courant.

  13. #13
    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
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      select DSI_STOGRP_VOLUME, DSI_STOGRP_SYSNAME
        from TF_DSI_STOGRP
       where DSI_STOGRP_DEXTRACT = '2021-02-04'
         and DSI_STOGRP_VOLUME in ( select DSI_STOGRP_VOLUME
                                      from TF_DSI_STOGRP
                                     where DSI_STOGRP_DEXTRACT = '2021-02-04'
                                  group by DSI_STOGRP_VOLUME
                                    having count(distinct DSI_STOGRP_SYSNAME) > 1 )
    order by DSI_STOGRP_VOLUME desc;

  14. #14
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Bonjour Waldar, ta requête fonctionne à merveille ! Merci.
    @ Tatayo, tu avais raison, il faut que je reprenne ma requête et que j'applique les même clause where sur t2.
    Ca fonctionne aussi, du coup j'ai deux requêtes qui fonctionnent.
    merci à vous deux !

    celle de Waldar est tout de même car je n'ai pas besoin d'exclure les CL% et les NONSMS

    Voici quand même ce que donne ma requête avec les clause where ajoutées à t2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select distinct t1.DSI_STOGRP_VOLUME, t1.DSI_STOGRP_SYSNAME
    from TF_DSI_STOGRP as t1
    inner join TF_DSI_STOGRP as t2 on t1.DSI_STOGRP_VOLUME = t2.DSI_STOGRP_VOLUME and t1.DSI_STOGRP_SYSNAME <> t2.DSI_STOGRP_SYSNAME
    where t1.DSI_STOGRP_DEXTRACT='2021-02-04' and t1.DSI_STOGRP_VOLUME <> 'CL%' and t1.DSI_STOGRP_SYSNAME <> 'NONSMS' and t2.DSI_STOGRP_DEXTRACT='2021-02-04' and t2.DSI_STOGRP_VOLUME <> 'CL%' and t2.DSI_STOGRP_SYSNAME <> 'NONSMS'
    order by t1.DSI_STOGRP_VOLUME asc

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/03/2010, 00h02
  2. [MySQL] PHP/SQL n'afficher que les champs vides
    Par rouly dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/02/2010, 05h47
  3. Réponses: 6
    Dernier message: 10/11/2009, 11h58
  4. Réponses: 6
    Dernier message: 26/11/2008, 20h14
  5. Réponses: 8
    Dernier message: 23/09/2008, 11h20

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