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

 Oracle Discussion :

Problème avec un pivot [11g]


Sujet :

Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Points : 159
    Points
    159
    Par défaut Problème avec un pivot
    Bonjour,

    n'étant pas un expert avec les requêtes oracle, j'ai du mal à obtenir ce que je veux avec la fonction pivot.

    soit le SQL 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
    SELECT
        DESI,
        EURO,
        DOLLAR
    FROM
        (
        SELECT  
            'Blouson XXL' AS DESI,
            'EURO' AS CODE,
            1.3 AS PRIX
        FROM
        DUAL
        UNION    
        SELECT  
            'Blouson XXL' AS DESI,
            'EURO' AS CODE,
            1.5 AS PRIX
        FROM
        DUAL
        UNION
        SELECT  
            'Blouson XXL' AS DESI,
            'DOLLAR' AS CODE,
            1.9 AS PRIX
        FROM
        DUAL
    )
    PIVOT (SUM(PRIX) FOR (CODE) IN ('EURO' AS EURO, 'DOLLAR' AS DOLLAR))
    le résultat obtenu me convient, c'est à dire que pour chaque DESI, j'ai la somme en EURO et en DOLLAR sur la même ligne.

    ensuite je rajoute la couleur :
    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
    SELECT
        DESI,
        COULEUR,
        EURO,
        DOLLAR
    FROM
        (
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'EURO' AS CODE,
            1.3 AS PRIX
        FROM
        DUAL
        UNION    
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'EURO' AS CODE,
            1.5 AS PRIX
        FROM
        DUAL
        UNION
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'DOLLAR' AS CODE,
            1.9 AS PRIX
        FROM
        DUAL
    )
    PIVOT (SUM(PRIX) FOR (CODE) IN ('EURO' AS EURO, 'DOLLAR' AS DOLLAR))
    le résultat me convient toujours

    par contre, c'est à partir de là, que ça ne va 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    SELECT
        DESI,
        COULEUR,
        EURO,
        DOLLAR
    FROM
        (
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'EURO' AS CODE,
            1.3 AS PRIX
        FROM
        DUAL
        UNION  
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'EURO' AS CODE,
            1.2 AS PRIX
        FROM
        DUAL
        UNION    
        SELECT  
            'Blouson XXL' AS DESI,
            'Bleu' AS COULEUR,
            'EURO' AS CODE,
            1.5 AS PRIX
        FROM
        DUAL
        UNION
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'DOLLAR' AS CODE,
            1.9 AS PRIX
        FROM
        DUAL
    )
    PIVOT (SUM(PRIX) FOR (CODE) IN ('EURO' AS EURO, 'DOLLAR' AS DOLLAR))
    j'aimerai faire un listagg de la couleur (unique) pour continuer d'avoir qu'une seule ligne en retour. le champs couleur est obligatoire dans le retour.

    Comment dois-je faire ?

    merci

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Points : 159
    Points
    159
    Par défaut
    réponse à moi même

    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
    40
    41
    42
    SELECT
        DESI,
        LISTAGG(COULEUR, chr(10))  WITHIN GROUP ( order by DESI ),
        sum(EURO),
        sum(DOLLAR)
    FROM
        (
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'EURO' AS CODE,
            1.3 AS PRIX
        FROM
        DUAL
        UNION  
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'EURO' AS CODE,
            1.2 AS PRIX
        FROM
        DUAL
        UNION    
        SELECT  
            'Blouson XXL' AS DESI,
            'Bleu' AS COULEUR,
            'EURO' AS CODE,
            1.5 AS PRIX
        FROM
        DUAL
        UNION
        SELECT  
            'Blouson XXL' AS DESI,
            'Rouge' AS COULEUR,
            'DOLLAR' AS CODE,
            1.9 AS PRIX
        FROM
        DUAL
    )
     
    PIVOT (SUM(PRIX) FOR (CODE) IN ('EURO' AS EURO, 'DOLLAR' AS DOLLAR))
    group by desi

  3. #3
    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
    Bravo, c'est ça.

    À noter que dans l'ORDER BY du WITHIN GROUP vous avez mis DESI alors que c'est votre colonne de regroupement, donc en fait il ne serve à rien.

    Autant trier par couleur !

    Aussi, pour les jeux de test préférez l'utilisation d'une CTE qui rend les données plus lisibles :
    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
    With MaTable (DESI, COULEUR, CODE, PRIX) as
    (
    SELECT 'Blouson XXL', 'Rouge', 'EURO'  , 1.3 FROM DUAL UNION ALL
    SELECT 'Blouson XXL', 'Rouge', 'EURO'  , 1.2 FROM DUAL UNION ALL
    SELECT 'Blouson XXL', 'Bleu' , 'EURO'  , 1.5 FROM DUAL UNION ALL
    SELECT 'Blouson XXL', 'Rouge', 'DOLLAR', 1.9 FROM DUAL
    )
      SELECT DESI
           , LISTAGG(COULEUR, ', ')  WITHIN GROUP (ORDER BY COULEUR) as COULEURS
           , sum(EURO)   as EURO
           , sum(DOLLAR) as DOLLAR
        FROM MaTable 
       PIVOT (SUM(PRIX) FOR (CODE) IN ('EURO' AS EURO, 'DOLLAR' AS DOLLAR))
    GROUP BY DESI;
     
    DESI        COULEURS    EURO DOLLAR
    ----------- ----------- ---- ------
    Blouson XXL Bleu, Rouge    4    1.9

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Points : 159
    Points
    159
    Par défaut
    merci de ton conseil.
    je vais le noter dans un coin du bureau

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

Discussions similaires

  1. [AC-2010] Problème avec les tables pivot
    Par Mathweyers dans le forum Access
    Réponses: 0
    Dernier message: 02/06/2015, 09h52
  2. problème avec pivot table
    Par pseudo88 dans le forum Développement
    Réponses: 7
    Dernier message: 27/04/2010, 20h12
  3. Problème avec Pivot de décision
    Par gueta7daniel dans le forum Bases de données
    Réponses: 0
    Dernier message: 10/02/2009, 17h49
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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