1

私は(SASで)SQLを使用しています。次のようなデータセット (テーブル) があります。

Y1 Y2 Y3
100 200 300

私が返したいのは、次のような 2 つの列です。

年値
1 100
2 200
3 300

これを達成するための SQL クエリは何でしょうか?

4

4 に答える 4

2

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 |
于 2012-12-20T13:17:14.627 に答える
2

試す :

SELECT y1 FROM yourtable
UNION ALL
SELECT y2 FROM yourtable
UNION ALL
SELECT y3 FROM yourtable
于 2012-12-20T13:06:47.113 に答える
1

たとえば、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
于 2012-12-20T13:16:04.420 に答える
0

列のピボットを解除する一般的な方法は、出力で必要な列と同じ数の行を含むテーブルでデカルト積を作成することです。この「テーブル」を取得する方法は、使用している 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

それを行う別の方法...

于 2012-12-20T13:54:23.320 に答える