さまざまな列のエントリが列ヘッダーに「ピボット」されているテーブルを作成したいと考えています。このテーブルはレポート用です。ユーザーは Excel 経由で (Microsoft Query を使用して) データのクエリを実行したいと考えています。問題は、Excel でピボットを実行すると、中程度のサイズのデータ セット (約 100k データ ポイント) の場合でも、ファイルが非現実的に大きくなり、速度が低下することです。 )。
次の例を検討してください。
CREATE TABLE tt
(
"COMMODITY" VARCHAR2(4000 BYTE),
"MARKET" VARCHAR2(4000 BYTE),
"BID_ASK" VARCHAR2(4000 BYTE),
"PRICE" NUMBER
);
INSERT INTO tt VALUES ('Gold','US','Ask',1.1);
INSERT INTO tt VALUES ('Gold','US','Bid',1);
INSERT INTO tt VALUES ('Gold','EU','Ask',1.2);
INSERT INTO tt VALUES ('Gold','EU','Bid',1.1);
INSERT INTO tt VALUES ('Oil','US','Ask',11);
INSERT INTO tt VALUES ('Oil','US','Bid',10);
INSERT INTO tt VALUES ('Oil','EU','Ask',12);
INSERT INTO tt VALUES ('Oil','EU','Bid',11);
私が達成したい出力は次のようになります(正確な列ヘッダーはあまり重要ではありません):
COMMODITY 'US_Bid' 'US_Ask' 'EU_Bid' 'EU_Ask'
Gold 1 1.1 1.1 1.2
Oil 10 11 11 12
これで、1 つの列を簡単にピボットできます。
SELECT * FROM
(
SELECT * FROM tt
)
PIVOT
(
SUM(PRICE)
FOR MARKET IN ('US','EU')
)
これにより、次のことが得られます。
COMMODITY BID_ASK 'US' 'EU'
Gold Bid 1 1.1
Oil Bid 10 11
Oil Ask 11 12
Gold Ask 1.1 1.2
私の調査によると、複数の列を直接ピボットするための構文はありません。関連する質問がいくつかあります (ここ、ここ、またはここ) が、私の問題に対する直接的な回答が見つかりませんでした。そこで、次の解決策を思いつきました。
SELECT * FROM
(
SELECT COMMODITY, CONCAT(CONCAT(MARKET,'_'),BID_ASK) AS MARKET_BID_ASK, PRICE FROM tt
)
PIVOT
(
SUM(PRICE)
FOR MARKET_BID_ASK IN ('US_Bid','US_Ask','EU_Bid','EU_Ask')
)
これにより、目的の出力が正確に生成されます。ただし、入力しなければならない変数の数が急激に増えるため、実用的な解決策とは考えていません (私の実際のデータ セットでは、一度により多くのフィールドをピボットしたいと考えており、そのすべてにさまざまな値が含まれています)。動的ピボットが存在することは知っていますが、これが Excel で機能するかどうかはわかりません。また、ユーザーが独自にクエリを定義するため、構文をできるだけ単純に保ちたいと考えています (単に適応できるテンプレート クエリ)。そこで、IN句でフィールド名をクエリしようとしました:
SELECT * FROM
(
SELECT COMMODITY, CONCAT(CONCAT(MARKET,'_'),BID_ASK) AS MARKET_BID_ASK, PRICE FROM tt
)
PIVOT
(
SUM(PRICE)
FOR MARKET_BID_ASK IN
(
SELECT DISTINCT CONCAT(CONCAT(MARKET,'_'),BID_ASK) AS MARKET_BID_ASK FROM tt
)
)
サブクエリで LIKE 条件を使用して連結されたすべてのオプションをリストしなくても、クエリされる変数を制限できるため、このようなソリューションは実用的であると思います。ただし、このクエリで「ORA-00936 - 式がありません」というエラーが表示されますが、見つけたドキュメントによると、ここではサブクエリが有効である必要があります。