web-dev-qa-db-fra.com

La requête Oracle Pivot donne des colonnes avec des guillemets autour des noms de colonne. Quoi?

J'essaie d'utiliser PIVOT dans Oracle et j'obtiens un résultat étrange. C'est probablement juste une option que je dois définir, mais ce que je sais sur Oracle/SQL, je pourrais le faire dans cette zone de commentaire.

Voici un exemple de ma requête:

with testdata as
(
    select 'Fred' First_Name, 10 Items from dual
    union
    select 'John' First_Name, 5  Items from dual
    union 
    select 'Jane' First_Name, 12 Items from dual
    union
    select 'Fred' First_Name, 15 Items from dual
)

select * from testdata
pivot (
    sum(Items)
    for First_Name
    in ('Fred','John','Jane')

Les résultats sortent comme je m'y attendais, sauf que les noms des colonnes ont des guillemets simples autour d'eux (image de Toad - si j'exporte vers Excel les citations sont transportées vers Excel):

Toad Data Grid

Comment puis-je me débarrasser des guillemets simples autour des noms de colonne? J'ai essayé de les supprimer dans la clause "in" et j'obtiens une erreur:

in (Fred,John,Jane)

Error message

J'ai également essayé de remplacer les guillemets simples par des guillemets doubles et j'ai eu la même erreur. Je ne sais pas s'il s'agit d'une option Oracle que je dois définir/désactiver avant d'exécuter ma requête ou une chose Toad.

18
Richard Schaefer

vous pouvez fournir des alias aux nouvelles colonnes dans la clause pivot de l'instruction IN. (NB: Ceci est différent de la clause where standard IN() qui n'autorise pas les alias.)

with testdata as
(
    select 'Fred' First_Name, 10 Items from dual
    union
    select 'John' First_Name, 5  Items from dual
    union 
    select 'Jane' First_Name, 12 Items from dual
    union
    select 'Fred' First_Name, 15 Items from dual
)
select * from testdata
pivot (
      sum(Items) 
      for First_Name
      in ('Fred' as fred,'John' as john,'Jane' as jane)
      )

et aussi pour votre clause d'agrégation qui est nécessaire si vous avez plusieurs clauses.

with testdata as
(
    select 'Fred' First_Name, 10 Items from dual
    union
    select 'John' First_Name, 5  Items from dual
    union 
    select 'Jane' First_Name, 12 Items from dual
    union
    select 'Fred' First_Name, 15 Items from dual
)
select * from testdata
pivot (
    sum(Items) itmsum,
    count(Items) itmcnt
    for First_Name
    in ('Fred' as fred,'John' as john,'Jane' as jane)
   )

retour

FRED_ITMSUM FRED_ITMCNT JOHN_ITMSUM JOHN_ITMCNT JANE_ITMSUM JANE_ITMCNT
----------- ----------- ----------- ----------- ----------- -----------
         25           2           5           1          12           1

Bien sûr, vous pouvez ensuite boucler la boucle et utiliser l'aliasing Oracle standard et les renommer comme bon vous semble, y compris en remettant des guillemets.

with testdata as
(
    select 'Fred' First_Name, 10 Items from dual
    union
    select 'John' First_Name, 5  Items from dual
    union 
    select 'Jane' First_Name, 12 Items from dual
    union
    select 'Fred' First_Name, 15 Items from dual
)
select FRED_ITMSUM "Fred's Sum", FRED_ITMCNT "Fred's Count"
     , JOHN_ITMSUM "John's Sum", JOHN_ITMCNT "John's Count"
     , JANE_ITMSUM "Janes's Sum", JANE_ITMCNT "Janes's Count"
from testdata
pivot (
    sum(Items) itmsum,
    count(Items) itmcnt
    for First_Name
    in ('Fred' as fred,'John' as john,'Jane' as jane)
   )

donne

Fred's Sum Fred's Count John's Sum John's Count Janes's Sum Janes's Count
---------- ------------ ---------- ------------ ----------- -------------
        25            2          5            1          12             1
50
ShoeLace