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

时间:2014-02-28 18:30:17

标签: 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')

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

Toad Data Grid

如何摆脱列名称周围的单引号?我尝试在“in”子句中将它们删除,我收到错误:

in (Fred,John,Jane)

Error message

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

1 个答案:

答案 0 :(得分:39)

您可以在“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

当然,你可以完全循环并使用标准的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)
   )

给出

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