web-dev-qa-db-ja.com

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を実行する前に、設定または設定解除する必要があります。

18

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

もちろん、次に完全に行き、標準の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
50
ShoeLace