1. ホーム
  2. sql

[解決済み] Oracle sqlのDynamic Pivot

2022-02-24 22:23:46

質問

... ピボット (sum(A) for B in (X))

ここで、Bはデータ型varchar2、Xはvarchar2の値をカンマで区切った文字列である。
Xの値は、同じテーブルのある列(例えばCL)から異なる値を選択します。このようにして、ピボット・クエリが動作するようになりました。

しかし、問題は、CL列に新しい値があるたびに、手動でその値を文字列Xに追加しなければならないことです。

私はXをselect distinct values from CLに置き換えてみました。しかし、クエリは実行されません。
Xを置き換えるには、カンマで区切られた値が必要なためだと感じました。
そして、文字列Xと一致する正確な出力を返す関数を作りました。しかし、クエリはまだ実行されません。
表示されるエラーメッセージは "missing righr parantheses", "end of file communication channel" 等々です。
ピボットだけでなく、ピボットxmlも試してみましたが、クエリは実行されるものの、oraxxxなどのまったく値のない数値が表示されます。

私の使い方が悪いのかもしれません。
動的な値を持つピボットを作成する方法を教えてください。

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

の中に定数でない文字列を入れることはできません。 IN 節があります。
そのためにPivot XMLを使うことができます。

から ドキュメンテーション :

サブクエリ サブクエリは、XML キーワードと組み合わせてのみ使用されます。 サブクエリを指定すると、サブクエリで見つかったすべての値が、そのサブクエリで使用されます。 ピボッティングに使用

このように表示されるはずです。

select xmlserialize(content t.B_XML) from t_aa
pivot xml(
sum(A) for B in(any)
) t;

また、サブクエリの代わりに ANY キーワードを使用します。

select xmlserialize(content t.B_XML) from t_aa
pivot xml(
sum(A) for B in (select cl from t_bb)
) t;

sqlfiddleのデモはこちらです。