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):
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)
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.
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