1. ホーム
  2. sql

[解決済み] Oracle の行の複数の列でピボットを使用する

2022-03-08 18:32:32

質問

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) を使用して、height または weight をピボットします。1 つのクエリで 3 つすべて (カウント、体重、身長) のピボットを実行することはできません。

ピボットを使ってできるのでしょうか?

どのように解決するのですか?

として ドキュメントでは のように、複数の集約関数節を持つことができます。だから、こんなことができる。

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フィドル .