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つすべて(数、重さ、身長)をピボットします。
ピボットを使用して実行できますか?
ドキュメントに示されている のように、複数の集約関数句を使用できます。だからあなたはこれを行うことができます:
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
列に名前を付ける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ステートメントを使用して回避します。
それが誰かを助けることを願っています。