Подтвердить что ты не робот

Запрос Oracle Pivot предоставляет столбцы с кавычками вокруг имен столбцов. Какие?

Я пытаюсь использовать PIVOT в Oracle, и я получаю странный результат. Вероятно, это просто вариант, который мне нужно установить, но то, что я знаю о Oracle/SQL, я мог бы вписаться в этот блок комментариев.

Вот пример моего запроса:

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')

Результаты выглядят так, как я ожидал, за исключением того, что имена столбцов имеют одинарные кавычки вокруг них (изображение из Toad - если я экспортирую в Excel, кавычки переносятся в Excel):

Toad Data Grid

Как избавиться от одиночных кавычек вокруг имен столбцов? Я попытался вынести их в разделе "in", и я получаю сообщение об ошибке:

in (Fred,John,Jane)

Error message

Я также попытался заменить одиночные кавычки двойными кавычками и получил ту же ошибку. Я не знаю, является ли это параметром Oracle, который мне нужно установить/отключить, прежде чем запускать мой запрос или предмет "Жаба".

4b9b3361

Ответ 1

Вы можете предоставить псевдонимы новым столбцам в предложении pivot оператора IN. (Примечание: это отличается от стандартного условия where IN(), которое не допускает псевдонимов.)

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

а также для вашего агрегатного предложения, которое необходимо, если у вас есть несколько предложений.

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

возвращает

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

Конечно, тогда вы можете пройти полный круг и использовать стандартный псевдоним оракула и переименовать их в любое удобное для вас место, включая повторное добавление кавычек.

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 Sum", FRED_ITMCNT "Fred Count"
     , JOHN_ITMSUM "John Sum", JOHN_ITMCNT "John Count"
     , JANE_ITMSUM "Janes Sum", JANE_ITMCNT "Janes Count"
from testdata
pivot (
    sum(Items) itmsum,
    count(Items) itmcnt
    for First_Name
    in ('Fred' as fred,'John' as john,'Jane' as jane)
   )

дает

Fred Sum Fred Count John Sum John Count Janes Sum Janes Count
---------- ------------ ---------- ------------ ----------- -------------
        25            2          5            1          12             1