Oracle Pivot查询为列提供了围绕列名称的引号.什么?

Ric*_*fer 16 sql oracle pivot

我正在尝试在Oracle中使用PIVOT,我得到了一个奇怪的结果.它可能只是我需要设置的一个选项,但我对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')
Run Code Online (Sandbox Code Playgroud)

结果如我所料,除了列名称周围有单引号(来自Toad的图片 - 如果我导出到Excel,引号会被带到Excel):

Toad数据网格

如何摆脱列名称周围的单引号?我尝试在"in"子句中取出它们,我收到一个错误:

in (Fred,John,Jane)
Run Code Online (Sandbox Code Playgroud)

错误信息

我也尝试用双引号替换单引号并得到相同的错误.我不知道这是否是我需要在运行查询或Toad之前设置/取消设置的Oracle选项.

Sho*_*ace 46

您可以在"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)
      )
Run Code Online (Sandbox Code Playgroud)

还有你的聚合条款,如果你有多个条款,这是必要的..

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)
   )
Run Code Online (Sandbox Code Playgroud)

回报

FRED_ITMSUM FRED_ITMCNT JOHN_ITMSUM JOHN_ITMCNT JANE_ITMSUM JANE_ITMCNT
----------- ----------- ----------- ----------- ----------- -----------
         25           2           5           1          12           1
Run Code Online (Sandbox Code Playgroud)

当然,你可以完全循环并使用标准的oracle别名,并将它们重命名为你喜欢的任何内容,包括重新输入引号.

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)
   )
Run Code Online (Sandbox Code Playgroud)

给

Fred's Sum Fred's Count John's Sum John's Count Janes's Sum Janes's Count
---------- ------------ ---------- ------------ ----------- -------------
        25            2          5            1          12             1
Run Code Online (Sandbox Code Playgroud)