web-dev-qa-db-ja.com

Oracle行の複数の列でピボットを使用する

Oracleテーブル(_tab1_)に次のサンプルデータがあり、行を列に変換しようとしています。 1つの列でOracleピボットを使用する方法を知っています。しかし、それを複数の列に適用することは可能ですか?

サンプルデータ:

_Type  weight  height  
A     50      10  
A     60      12  
B     40      8  
C     30      15  
_

私の意図した出力:

_A-count B-count C-count A-weight B-weight C-weight A-height B-height C-height  
2       1       1       110      40       30       22       8        15  
_

私は何ができますか:

_with T AS 
(select type, weight from tab1 )
select * from T
PIVOT (
count(type)
for type in (A, B, C, D,E,F)
)  
_

上記のクエリは私に以下の結果を与えます

_A B C  
2 1 1  
_

count(*)sum(weight)またはsum(height)に置き換えて、ピボットの高さまたは重量にできます。私がやろうとしていることはできませんが、1つのクエリで3つすべて(数、重さ、身長)をピボットします。

ピボットを使用して実行できますか?

15
Badal

ドキュメントに示されている のように、複数の集約関数句を使用できます。だからあなたはこれを行うことができます:

select * from (
  select * from tab1
)
pivot (
  count(type) as ct, sum(weight) as wt, sum(height) as ht
  for type in ('A' as A, 'B' as B, 'C' as C)
);

A_CT A_WT A_HT B_CT B_WT B_HT C_CT C_WT C_HT
---- ---- ---- ---- ---- ---- ---- ---- ----
   2  110   22    1   40    8    1   30   15 

表示した順序で列が必要な場合は、別のレベルのサブクエリを追加します。

select a_ct, b_ct, c_ct, a_wt, b_wt, c_wt, a_ht, b_ht, c_ht
from (
  select * from (
    select * from tab1
  )
  pivot (
    count(type) as ct, sum(weight) as wt, sum(height) as ht
    for type in ('A' as A, 'B' as B, 'C' as C)
  )
);

A_CT B_CT C_CT A_WT B_WT C_WT A_HT B_HT C_HT
---- ---- ---- ---- ---- ---- ---- ---- ----
   2    1    1  110   40   30   22    8   15 

SQL Fiddle

25
Alex Poole

列に名前を付ける2番目のアプローチはさらに優れており、より多くの問題を解決します。 PIVOTから返されたデータを合計したいという要件があり、列名を使用して2を追加するだけで3番目に必要な結果を得ることができました。

select a_ct, b_ct, c_ct, a_wt, b_wt, c_wt, a_ht, b_ht, c_ht, a_wt + b_wt + c_wt tot_wt
from (
  select * from (
    select * from tab1
  )
  pivot (
    count(type) as ct, sum(weight) as wt, sum(height) as ht
    for type in ('A' as A, 'B' as B, 'C' as C)
  )
);

A_CT B_CT C_CT A_WT B_WT C_WT A_HT B_HT C_HT TOT_WT
---- ---- ---- ---- ---- ---- ---- ---- ---- ------
   2    1    1  110   40   30   22    8   15 180

使用するPIVOT列の1つがnullを返す場合、集計関数(sumなど)は期待どおりに動作しないことに注意してください。その場合、CASEステートメントを使用して回避します。

それが誰かを助けることを願っています。

1
Amit S