需要将单列分成多列

Sur*_*h E 5 sql-server-2005 sql-server

我的表有一个单列的数据:

1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

我想要这样的输出:

1 2 3 4 5-first row
6 7 8 9 10 - second row
Run Code Online (Sandbox Code Playgroud)

另一个有两列这样的:

Column 1           Column 2
1                  a
2                  b
3                  c
4                  d
5                  e
6                  f
7                  g
8                  h
9                  i
10                 j
Run Code Online (Sandbox Code Playgroud)

我希望它显示如下:

1 a 2 b 3 c 4 d 5 e-first row
6 f 7 g 8 h 9 i 10 j - second row
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 7

对于第一种情况,您可以使用ROW_NUMBERthenPIVOT来执行此操作,使用运算符将其划分为列,并将整数除以 5 的结果分组为行。

WITH CTE AS
(
SELECT C,
       (ROW_NUMBER() OVER (ORDER BY C) -1)%5 AS Col,
       (ROW_NUMBER() OVER (ORDER BY C) -1)/5 AS Row
FROM YourTable       
)
SELECT [0], [1], [2], [3], [4]
FROM CTE
PIVOT (MAX(C) FOR Col IN ([0], [1], [2], [3], [4])) AS Pvt
ORDER BY Row
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

对于第二种情况,Oracle 有一个直接的语法来实现这一点PIVOT。SQL Server 没有,但您可以按如下方式执行此操作。

WITH CTE AS
(
SELECT *,
       (ROW_NUMBER() OVER (ORDER BY Column1) -1)%5 AS Col,
       (ROW_NUMBER() OVER (ORDER BY Column1) -1)/5 AS Row
FROM YourTable       
)
SELECT MAX(CASE WHEN Col = 0 THEN Column1 END),
       MAX(CASE WHEN Col = 0 THEN Column2 END),
       MAX(CASE WHEN Col = 1 THEN Column1 END),
       MAX(CASE WHEN Col = 1 THEN Column2 END),
       MAX(CASE WHEN Col = 2 THEN Column1 END),
       MAX(CASE WHEN Col = 2 THEN Column2 END),
       MAX(CASE WHEN Col = 3 THEN Column1 END),
       MAX(CASE WHEN Col = 3 THEN Column2 END),
       MAX(CASE WHEN Col = 4 THEN Column1 END),
       MAX(CASE WHEN Col = 4 THEN Column2 END)
FROM CTE
GROUP BY Row
ORDER BY Row
Run Code Online (Sandbox Code Playgroud)

SQL小提琴