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 :

Select compliqué inversion ligne/colonne


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut Select compliqué inversion ligne/colonne
    J'ai une table article qui est composé des champs suivants : id, couleur, teinte, nom et marque. Elle est remplie avec les données suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ID      Couleur     Teinte    Nom    Marque
    1       Blue         Clear     A11   Addidas
    2       Blue         Dark      A22   Nike
    3       Blue         Dark      A22   Reebok
    4       Blue         Dark      A22   New_Balance
    5       Red         Clear      A11   Klein
    6       Red         Dark       A22   Dolce
    Comment peut-on avec ses données obtenir ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Couleur Teinte    A22
    Blue    Clear      Nike-Reebok-New_Balance
    Red     Clear      Dolce
    J'espère que c'est suffisamment clair. Merci.

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Un petit DECODE devrait faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Couleur, Teinte,
           DECODE (Nom, 'A22', Marque) As A22
    FROM Articles
    ...

  3. #3
    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
    C'est du string aggregation que vous voulez faire.
    La solution est nativement implémentée à partir de 11gR2.

    Sinon il y a d'autres solutions, mais elles dépendent de votre version d'Oracle.

    Par contre, comment gérez-vous votre la partie teinte, j'ai peut-être raté quelque chose ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Waldar,

    Oui, c'est de l'aggrégation et non je ne suis pas en 11g mais plutôt en 10g. La partie teinte n'est pas nécessaire à la solution du problème. Il faut aggréger tout ce qui correspond au couple Blue, A11 pour A22. Donc
    Nike-Reebok-New_Balance avec l'entête de Colonne A22.

    Xdescamp,

    Je dois regarder si cela correspond à mon cas réel.

    A+

  5. #5
    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
    Voici une solution :
    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 1 as id, 'Blue' as clr, 'Clear' as tnt, 'A11' as nom, 'Addidas' as mar from dual union all
    select 2      , 'Blue'       , 'Dark'        , 'A22'       , 'Nike'           from dual union all
    select 3      , 'Blue'       , 'Dark'        , 'A22'       , 'Reebok'         from dual union all
    select 4      , 'Blue'       , 'Dark'        , 'A22'       , 'New_Balance'    from dual union all
    select 5      , 'Red'        , 'Clear'       , 'A11'       , 'Klein'          from dual union all
    select 6      , 'Red'        , 'Dark'        , 'A22'       , 'Dolce'          from dual
    )
      select MT1.id, MT1.clr, MT1.tnt, MT1.nom,
             rtrim(replace(replace(xmlagg(xmlelement("x", mt2.mar)), '<x>', ''), '</x>', '-'), '-') as agg
        from MaTable MT1
             inner join MaTable MT2
               on MT2.clr = MT1.clr
       where MT1.nom = 'A11'
         and MT2.nom = 'A22'
    group by MT1.id, MT1.clr, MT1.tnt, MT1.nom
    order by MT1.id asc;
     
    ID	CLR	TNT	NOM	AGG
    1	Blue	Clear	A11	Nike-Reebok-New_Balance
    5	Red	Clear	A11	Dolce

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Xdescamp,

    Non, il n'y pas d'aggrégation dans ce que tu me proposes. Il faut arriver à aggréger toutes les marques possibles pour les couleurs Blue et Red sur une ligne chacune. Donc le résultat sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ID Couleur   Teinte  Nom   Marques
    1  Blue      Clear   A11   Nike-Reebok-New_Balance    
    5  Red       Clear   A11   Dolce

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Merci, c'est tout à fait ça.



    Pourrait-on mettre les marques en ordre alphabétique ? Dans mon exemple, ce sont des marques mais ma situation réelle implique une double conversion tout d'abord transformer un décimal en hexa puis en varchar2 sur quatre digit. Si je ne fais pas erreur il n'y a pas en 10g de fonction qui convertit un décimal en hexa et vice versa ?

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Citation Envoyé par lcaya Voir le message
    Non, il n'y pas d'aggrégation dans ce que tu me proposes. Il faut arriver à aggréger toutes les marques possibles pour les couleurs Blue et Red sur une ligne chacune.
    Désolé, j'avais lu un peu vite...

  9. #9
    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
    Citation Envoyé par lcaya Voir le message
    Pourrait-on mettre les marques en ordre alphabétique ?
    C'est possible, XMLAgg accepte ORDER BY :
    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 1 as id, 'Blue' as clr, 'Clear' as tnt, 'A11' as nom, 'Addidas' as mar from dual union all
    select 2      , 'Blue'       , 'Dark'        , 'A22'       , 'Nike'           from dual union all
    select 3      , 'Blue'       , 'Dark'        , 'A22'       , 'Reebok'         from dual union all
    select 4      , 'Blue'       , 'Dark'        , 'A22'       , 'New_Balance'    from dual union all
    select 5      , 'Red'        , 'Clear'       , 'A11'       , 'Klein'          from dual union all
    select 6      , 'Red'        , 'Dark'        , 'A22'       , 'Dolce'          from dual
    )
      select MT1.id, MT1.clr, MT1.tnt, MT1.nom,
             rtrim(replace(replace(xmlagg(xmlelement("x", mt2.mar) order by mt2.mar asc), '<x>', ''), '</x>', '-'), '-') as agg
        from MaTable MT1
             inner join MaTable MT2
               on MT2.clr = MT1.clr
       where MT1.nom = 'A11'
         and MT2.nom = 'A22'
    group by MT1.id, MT1.clr, MT1.tnt, MT1.nom
    order by MT1.id asc;
     
    ID	CLR	TNT	NOM	AGG
    1	Blue	Clear	A11	New_Balance-Nike-Reebok
    5	Red	Clear	A11	Dolce

    Dans mon exemple, ce sont des marques mais ma situation réelle implique une double conversion tout d'abord transformer un décimal en hexa puis en varchar2 sur quatre digit. Si je ne fais pas erreur il n'y a pas en 10g de fonction qui convertit un décimal en hexa et vice versa ?
    Si, avec le format 'XX' de to_char / to_number :
    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
    36
    37
    38
    39
        select level-1 as deci,
               to_char(level-1, 'FMXX') as hexa
          from dual
    connect by level <= 33;
     
    DECI	HEXA
    0	0
    1	1
    2	2
    3	3
    4	4
    5	5
    6	6
    7	7
    8	8
    9	9
    10	A
    11	B
    12	C
    13	D
    14	E
    15	F
    16	10
    17	11
    18	12
    19	13
    20	14
    21	15
    22	16
    23	17
    24	18
    25	19
    26	1A
    27	1B
    28	1C
    29	1D
    30	1E
    31	1F
    32	20

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Excellent !


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

Discussions similaires

  1. [AC-2003] Inversion ligne colonne
    Par aminnio dans le forum VBA Access
    Réponses: 48
    Dernier message: 18/06/2013, 10h56
  2. Inverser ligne colonne
    Par GIS_User dans le forum Requêtes
    Réponses: 8
    Dernier message: 03/04/2011, 04h26
  3. Inverser Ligne & Colonnes en SQL
    Par chrislcf dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/08/2008, 12h32
  4. [VBA-E]Selection d'une ligne a partir d'une certaine colonne
    Par deathsurfer dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 29/06/2006, 16h36
  5. est il possible d'inverser ligne/colonne ?
    Par kiki26 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 25/01/2005, 15h35

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