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)
对于第一种情况,您可以使用ROW_NUMBER
thenPIVOT
来执行此操作,使用模运算符将其划分为列,并将整数除以 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)
对于第二种情况,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)
归档时间: |
|
查看次数: |
8487 次 |
最近记录: |