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 :

Distinct de plusieurs colonnes d'une seule table.


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de youhibadelphi
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Juin 2009
    Messages : 240
    Points : 108
    Points
    108
    Par défaut Distinct de plusieurs colonnes d'une seule table.
    Salut
    Je cherche faire un distinct sur plusieurs champs d’une seule table, le code que j’ai utilisé est le suivant

    Select distinct col1, col2, col3
    From matable

    J’ai essayé d’afficher les colonnes dans un quickrep mais il y a qu’une seule colonne distincte col3

    Col1 col2 col3
    01 25 lieu
    01 25 lieu1
    01 25 lieu2
    01 25 lieu3


    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Le DISTINCT s'applique sur les lignes, et vos quatre lignes sont bien distinctes. Que cherchez-vous à faire?

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Comme le dit Snipah, tes lignes sont distinctes : tu ne peux pas analyser les colonnes indépendamment avec un DISTINCT.
    Il faut que tu le fasses par programmation.

    Parce que c'est plus propre : SQL n'est pas là pour t'afficher du vide lorsqu'il y a des valeurs répétées.

    Bien sûr, tu peux toujours le faire en SQL malgré tout, mais ça va donner un truc horrible.
    Exemple sous Oracle (8 ou plus) :

    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
     
    with t as (
    select 1 as a,2 as b, 'col' as c from dual union all
    select 1 as a,2 as b, 'col1' as c from dual union all
    select 1 as a,2 as b, 'col2' as c from dual union all
    select 1 as a,3 as b, 'col3' as c from dual union all
    select 2 as a,2 as b, 'col2' as c from dual union all
    select 2 as a,2 as b, 'col3' as c from dual 
    ),
    w as (
    select a, b, c  
    , lag(a, 1) over(order by a, b, c) as pa
    , lag(b, 1) over(order by a, b, c) as pb
    , lag(c, 1) over(order by a, b, c) as pc
    from t
    )
    select case a when pa then null else a end as a,
    case b when pb then null else b end as b,
    case c when pc then null else c end as c
    from w
    order by w.a, w.b, w.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
             A          B C   
    ---------- ---------- ----
             1          2 col 
                          col1
                          col2
                        3 col3
             2          2 col2
                          col3
     
     
    6 rows selected.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  4. #4
    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
    On peut faire un peu plus court pacmann :
    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
    WITH t AS
    (
    SELECT 1 AS a, 2 AS b, 'col' AS c FROM dual union ALL
    SELECT 1     , 2     , 'col1'     FROM dual union ALL
    SELECT 1     , 2     , 'col2'     FROM dual union ALL
    SELECT 1     , 3     , 'col3'     FROM dual union ALL
    SELECT 2     , 2     , 'col2'     FROM dual union ALL
    SELECT 2     , 2     , 'col3'     FROM dual 
    )
    SELECT
        nullif(a, lag(a) over(ORDER BY a, b, c)) AS a,
        nullif(b, lag(b) over(ORDER BY a, b, c)) AS b,
        nullif(c, lag(c) over(ORDER BY a, b, c)) AS c
    FROM t
    ORDER BY t.a, t.b, t.c;
     
    A	B	C
    1	2	col
    		col1
    		col2
    	3	col3
    2	2	col2
    		col3

  5. #5
    Membre régulier Avatar de youhibadelphi
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Juin 2009
    Messages : 240
    Points : 108
    Points
    108
    Par défaut
    Salut Snipah
    Si les colonnes sont distinctes normalement l'affichage du résultat doit être de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ---------------
    Col1 col2 col3 
    ---------------
    01   25    lieu
                 lieu1
                 lieu2
                 lieu3
    ---------------
    Je veux dire que le résultat d'un distincte n'affiche les doublons.
    Merci

  6. #6
    Membre régulier Avatar de youhibadelphi
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Juin 2009
    Messages : 240
    Points : 108
    Points
    108
    Par défaut
    Salut
    @pacmann
    @Waldar
    Merci pour le code mais je remarque que le numéro 2 est répété deux fois dans la colonne b?

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si tu veux dire que 01 25 ne doit figurer que sur la première ligne et pas sur les suivantes, c'est de la mise en forme, de la cosmétique, et ce n'est pas le boulot du SGBD mais celui du langage de programmation de l'application qui utilise la BDD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre régulier Avatar de youhibadelphi
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Juin 2009
    Messages : 240
    Points : 108
    Points
    108
    Par défaut
    Salut CinePhil
    Non ce n'est pas ça, je veux que l'affichage d'une seule colonne ne contient pas de doublons. Et merci de bien lire mes message pour me comprendre.
    Merci.

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu es parti de ce résultat :
    Col1 col2 col3
    01 25 lieu
    01 25 lieu1
    01 25 lieu2
    01 25 lieu3
    Et tu veux, si j'ai bien compris, ce résultat :
    ---------------
    Col1 col2 col3
    ---------------
    01 25 lieu
    lieu1
    lieu2
    lieu3
    ---------------
    Il s'agit bien de ne pas afficher 01 25 pour lieu1, lieu2 et lieu3 non ?
    Alors bis repetita :
    c'est de la mise en forme, de la cosmétique, et ce n'est pas le boulot du SGBD mais celui du langage de programmation de l'application qui utilise la BDD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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
    Citation Envoyé par youhibadelphi Voir le message
    Merci pour le code mais je remarque que le numéro 2 est répété deux fois dans la colonne b?
    Certes, mais ce n'est pas le même jeu de données.
    Si on implémente le votre :
    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 '01' AS a, '25' AS b, 'lieu' AS c FROM dual union ALL
    SELECT '01'     , '25'     , 'lieu1'     FROM dual union ALL
    SELECT '01'     , '25'     , 'lieu2'     FROM dual union ALL
    SELECT '01'     , '25'     , 'lieu3'     FROM dual
    )
    SELECT
        nullif(a, lag(a) over(ORDER BY a, b, c)) AS a,
        nullif(b, lag(b) over(ORDER BY a, b, c)) AS b,
        nullif(c, lag(c) over(ORDER BY a, b, c)) AS c
    FROM t
    ORDER BY t.a, t.b, t.c;
     
    A	B	C
    01	25	lieu
    		lieu1
    		lieu2
    		lieu3

  11. #11
    Membre régulier Avatar de youhibadelphi
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Juin 2009
    Messages : 240
    Points : 108
    Points
    108
    Par défaut
    Salut
    @CinePhil
    Mais je cherche afficher les dnnées de chaque colonne indépendante de l'autre, c'est possible?

  12. #12
    Membre régulier Avatar de youhibadelphi
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Juin 2009
    Messages : 240
    Points : 108
    Points
    108
    Par défaut
    salut
    @Waldar
    mais peut on remplacer les chiffre dans ce code avec le nom de champ
    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT 'col1' AS a, 'col2' AS b, 'col3' AS c FROM dual union ALL...
    ...

  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
    J'ai l'impression qu'on ne parle vraiment pas de la même chose...
    Je suis désolé mais je ne vous comprends pas !

  14. #14
    Membre régulier Avatar de youhibadelphi
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Juin 2009
    Messages : 240
    Points : 108
    Points
    108
    Par défaut
    Salut
    @Waldar
    Dans votre code il ya 01, 25, lieu1 mais ça se peux que les colonnes contiennent autre chiffre et autres lieu, c'est pourquoi je cherche faire les distinctes pour les champs quelque soit leur contenu, et d'éviter l'affichage des doublons dans le quickrep.
    Mais j'ai bien copié votre code et je ferai un essai
    Merci

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Dans la requête de Waldar, la clause WITH sert à construire un jeu de données pour tester la requête.
    Vous pouvez donc enlever cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH t AS
    (
    SELECT '01' AS a, '25' AS b, 'lieu' AS c FROM dual union ALL
    SELECT '01'     , '25'     , 'lieu1'     FROM dual union ALL
    SELECT '01'     , '25'     , 'lieu2'     FROM dual union ALL
    SELECT '01'     , '25'     , 'lieu3'     FROM dual
    )

  16. #16
    Membre régulier Avatar de youhibadelphi
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Juin 2009
    Messages : 240
    Points : 108
    Points
    108
    Par défaut
    salut
    @Snipah
    ok merci

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/02/2011, 19h11
  2. Update de plusieur colonne d'une meme table
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/09/2006, 09h25
  3. [MySQL] Remplir plusieurs lignes d'une seule table avec le même formulaire
    Par zehni dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/09/2006, 12h12
  4. [VBA] Fusionner plusieurs colonnes en une seule
    Par brutos2 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/01/2006, 14h25
  5. Réponses: 4
    Dernier message: 14/09/2005, 16h29

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