テーブルには、一連の整数を持つ列が 1 つだけ含まれます。
1
2
3
4
...
20
1 つのクエリだけで 3 つの列を持つテーブルに転置することは可能ですか? したがって、結果は次のようになります。
1 2 3
4 5 6
7 8 9
...
19 20 null
テーブルには、一連の整数を持つ列が 1 つだけ含まれます。
1
2
3
4
...
20
1 つのクエリだけで 3 つの列を持つテーブルに転置することは可能ですか? したがって、結果は次のようになります。
1 2 3
4 5 6
7 8 9
...
19 20 null
試す:
with cte as
(select myCol,
floor((row_number() over (order by myCol)-1)/3) rn,
(row_number() over (order by myCol)-1) % 3 + 1 cn
from myTable)
select [1],[2],[3]
from
(select * from cte) as src
pivot
(max(myCol)
for cn in ([1],[2],[3])) as pvt
ここでSQLFiddle 。
これを試してみてください -
DECLARE @temp TABLE (id INT)
INSERT INTO @temp (id)
VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20)
SELECT [1], [2], [3]
FROM (
SELECT
id
, rn = (ROW_NUMBER() OVER (ORDER BY id) - 1) % 3 + 1
, rn2 = (ROW_NUMBER() OVER (ORDER BY id) - 1) / 3
FROM @temp
) t
PIVOT
(
MAX(id)
FOR rn IN ([1], [2], [3])
) pvt
シーケンスによって、値が単純に 1 ずつ増加することを意味する場合は、基本的に算術演算でこれを行うことができます。
select mycol,
(case when mycol + 1 <= maxval then mycol + 1 end),
(case when mycol + 2 <= maxval then mycol + 2 end)
from myTable cross join
(select min(myCol)%3 as offset,
max(myCol) as maxval
from myTable
) const
where (mycol - offset)%3 = 0;
他のソリューションはより一般的です。シーケンス内の任意の値をピボットします。これは具体的には、1 ずつ増加する数値のみをピボットします。