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 :

numéroter des lignes selon les valeurs d'une colonne


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 56
    Points
    56
    Par défaut numéroter des lignes selon les valeurs d'une colonne
    Bonjour à tous

    On vient de me soumettre un problème et je m'interroge sur la possibilité de le résoudre en SQL (sans utiliser de PL/SQL).

    Il s'agit de faire un SELECT sur une table dont le contenu ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    col1 | col2 | col3
      1     a       c   
      2     b       d
      2     b       e
      3     a       c
      3     b       d
      3     b       e
    L'idée est d'obtenir une 4ème colonne comportant le numéro de l'occurence de la colonne col1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    col1 | col2 | col3 | col4
      1     a       c     1      
      2     b       d     1
      2     b       e     2
      3     a       c     1
      3     b       d     2 
      3     b       e     3
    Pour le moment je fais quelques essais en SQL pour essayer de compter le nombre d'occurences de chaque valeur de col1, mais c'est assez peu concluant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.col1,a.col2,a.col3,count(*) as col4
    from table a
    group by a.col1,a.col2,a.col3
    Cette requête met col4 à 1 systématiquement, puisque le group by contient tous les champs (passage obligé puisque j'ai besoin de ces champs dans le select) et que chaque combinaison des trois champs n'a qu'une seule occurence...

    Je continue à fouiller, mais si quelqu'un à une idée (un genre de rownum par valeurs d'une colonne peut-être)...

    Merci d'avance

  2. #2
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Hello,

    Fonction: dense_rank

    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
     
     
    select   Col1,col2,col3, 
             dense_rank() over(order by Col1) Num_occ
    from
       (
    	WITH Tab AS
    	(
    	SELECT 1        AS col1     , 'a'     AS col2     , 'c'    AS col3  FROM dual 
    	union all
    	SELECT 2        AS col1     , 'b'     AS col2     , 'd'    AS col3  FROM dual 
    	union all
    	SELECT 2        AS col1     , 'b'     AS col2     , 'e'    AS col3  FROM dual 
    	union all
    	SELECT 3        AS col1     , 'a'     AS col2     , 'c'    AS col3  FROM dual 
    	union all
    	SELECT 3        AS col1     , 'b'    AS col2     ,  'd'    AS col3  FROM dual 
    	union all
    	SELECT 3        AS col1     , 'b'     AS col2     , 'e'    AS col3  FROM dual 
    	)
    	select * from tab   
       )
    Avec des lettres:
    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
     
    select   Col1,col2,col3, 
             dense_rank() over(order by Col1) Num_occ
    from
       (
    	WITH Tab AS
    	(
    	SELECT 'a'        AS col1     , 'a'     AS col2     , 'c'    AS col3  FROM dual 
    	union all
    	SELECT 'g'        AS col1     , 'b'     AS col2     , 'd'    AS col3  FROM dual 
    	union all
    	SELECT 'c'        AS col1     , 'b'     AS col2     , 'e'    AS col3  FROM dual 
    	union all
    	SELECT 'a'        AS col1     , 'a'     AS col2     , 'c'    AS col3  FROM dual 
    	union all
    	SELECT 't'        AS col1     , 'b'    AS col2     ,  'd'    AS col3  FROM dual 
    	union all
    	SELECT 'e'        AS col1     , 'b'     AS col2     , 'e'    AS col3  FROM dual 
    	)
    	select * from tab   
       )
     
    COL1 COL2 COL3 NUM_OCC                
    ---- ---- ---- ---------------------- 
    a    a    c    1                      
    a    a    c    1                      
    c    b    e    2                      
    e    b    e    3                      
    g    b    d    4                      
    t    b    d    5
    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  3. #3
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Ce genre de requete peut vous aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    	A.Col1,
    	A.Col2,
    	A.Col3,
    	COUNT(1)
    FROM
    	MaTable A INNER JOIN MaTable B 
    	ON (A.Col1 = B.col1  and A.Col3<=B.Col3)
    GROUP BY
    	A.Col1,
    	A.Col2,
    	A.Col3
    A tester et adapter

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Points : 56
    Points
    56
    Par défaut
    @jkofr

    avant tout merci pour ta réponse ultra rapide

    par contre ce que tu me proposes ne correspond pas exactement à ce qu'il me faut...

    avec ton exemple, voilà ce que je souhaiterai obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    COL1 COL2 COL3 NUM_OCC                
    ---- ---- ---- ---------------------- 
    a    a    c    1                      
    a    a    c    2                    
    c    b    e    1                      
    e    b    e    1                      
    g    b    d    1                      
    g    b    e    2
    g    c    d    3

    @yanika

    cela ressemble effectivement aux tests que je suis en train de faire... merci pour ton aide

    [EDIT] : j'ai ma solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT col1,col2,col3,RANK() OVER (PARTITION BY col1 ORDER BY col3) as col4
    FROM (SELECT * FROM tab)
    Avec ça j'obtiens bien le numéro de l'occurence de col1 pour chaque valeur de col1.
    Merci pour m'avoir mis sur la piste !

    Bonne journée à tous

  5. #5
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Oui, c juste.
    J'avais pas compris ce point la.

    Ravis que tu ais trouve ta solution.

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 25/07/2012, 11h46
  2. [AC-2007] Comptage dans une zone de liste selon les valeurs d'une colonne
    Par lakhdar16 dans le forum VBA Access
    Réponses: 4
    Dernier message: 18/07/2012, 11h11
  3. [XL-2003] Extraction de ligne selon la valeur d'une colonne dans un autre fichier
    Par vikvalesteam dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/07/2011, 10h52
  4. Comment filtrer des lignes sur la valeur d'une colonne
    Par BerBiX dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/06/2010, 13h46
  5. Réponses: 1
    Dernier message: 15/05/2008, 11h48

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