テーブルに 50 列があり、1 行しか返されません。50 列の 1 行を 50 行と 1 列で表示したいと考えています。
Oracleクエリを提案してくれる人はいますか?
このような1行を使用UNPIVOT
して、値を持つ列のみを取得できます
SELECT colvalue
FROM
(
SELECT *
FROM Table1
UNPIVOT INCLUDE NULLS
(
colvalue FOR cols IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, ... col50)
)
);
出力例:
| | コルバリュー | ------------ | | 1 | | | 2 | | | (ヌル) | |…………|
ピボットされたテーブルの列名を持つ列が必要な場合は、外側の選択を捨てるだけです
SELECT *
FROM Table1
UNPIVOT INCLUDE NULLS
(
colvalue FOR cols IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, ... col50)
);
出力例:
| | COLS | コルバリュー | -------------------- | | COL1 | 1 | | | COL2 | 2 | | | COL3 | (ヌル) | | | …… |………… |
これがSQLFiddleのデモです
多くの入力に備えてください:) OracleにはUNPIVOT
機能がありますが、結果に少なくとも2つの列が必要なため、状況では機能しません.
まず、1 から 50 までのカウンターが必要です。次のようにクエリを実行できます。
SELECT LEVEL as Counter FROM DUAL CONNECT BY LEVEL <= 50
このクエリを実行すると、結果として 1 ~ 50 の数字が得られます。それを基礎として、完全な(っぽい)クエリは次のとおりです。
WITH Cols AS (
SELECT LEVEL as Counter
FROM DUAL
CONNECT BY LEVEL <= 50
)
SELECT
CASE Cols.Counter
WHEN 1 THEN Col1
WHEN 2 THEN Col2
WHEN 3 THEN Col3
. . .
WHEN 50 THEN Col50
END AS myColumn
FROM myTable
CROSS JOIN Cols
ORDER BY Cols.Counter
すべての列は同じデータ型である必要があることに注意してください。文字、数値、日付が混在している場合は、それらをすべて文字に変換する必要があります。
質問で述べたように、このクエリはテーブル内の1 つの行を想定していることに注意してください。複数の行がある場合は、 で終了する必要がありますORDER BY a-column-that-identifies-the-row, Cols.Counter
。