私は(SASで)SQLを使用しています。次のようなデータセット (テーブル) があります。
Y1 Y2 Y3 100 200 300
私が返したいのは、次のような 2 つの列です。
年値 1 100 2 200 3 300
これを達成するための SQL クエリは何でしょうか?
SQL Server 2005 以降では、次のUNPIVOT
関数を使用できます。
select replace(col, 'Y', '') year,
value
from yourtable
unpivot
(
value
for col in (Y1, Y2, Y3)
) unpiv
デモで SQL Fiddle を参照してください
UNION ALL
これは、クエリを使用する場合と同じプロセスです。
select 1 Year, Y1 value
from yourtable
union all
select 2 Year, Y2 value
from yourtable
union all
select 3 Year, Y3 value
from yourtable
デモで SQL Fiddle を参照してください
どちらも同じ結果になります。
| YEAR | VALUE |
----------------
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
試す :
SELECT y1 FROM yourtable
UNION ALL
SELECT y2 FROM yourtable
UNION ALL
SELECT y3 FROM yourtable
たとえば、ID の行に主キーがあると仮定します。
ID Y1 Y2 Y3
1 100 200 300
次に、この種のことが機能するはずです
SELECT MOCKTABLE.* FROM (
SELECT 1 AS Year, Y1 AS VALUE FROM x WHERE ID = y
UNION ALL
SELECT 2 AS Year, Y2 AS VALUE FROM x WHERE ID = y
UNION ALL
SELECT 3 AS Year, Y3 AS VALUE FROM x WHERE ID = y
) MOCKTABLE
列のピボットを解除する一般的な方法は、出力で必要な列と同じ数の行を含むテーブルでデカルト積を作成することです。この「テーブル」を取得する方法は、使用している RDBMS によって異なります。オラクルの例を次に示します。
select
r "Year",
case r when 1 then y1 when 2 then y2 when 3 then y3 else null end "Value"
from
t1, (select level r from dual connect by level <= 3)
これにより、次のことが得られます。
Year Value
1 100
2 200
3 300
それを行う別の方法...