MS SQL Server:
我有一张表格如下:
CREATE TABLE #Coltable
(
Name VARCHAR(10)
)
INSERT INTO #Coltable
VALUES
('P'),
('Q'),
('R'),
('S'),
('T'),
('U'),
('V'),
('W'),
('X')
想要结果如下:
col1 col2 col3
P Q R
S T U
V W X
必须将第一个记录(P)插入第一行第1列(Col1), 第二行(Q)必须插入第二列(COL2), 第三行(R)必须插入第三列(col3), 第四行(S)必须作为下一行插入第一列(col1), 第五行(T)必须插入第二列(col2)作为下一行,并且像这样继续进行。
答案 0 :(得分:0)
将行排序放在ORDER BY
的{{1}}内OVER
,以便在旋转之前正确排序记录。
ROW_NUMBER()
此解决方案计算每个行的升序整数排名,然后使用除法(WITH Data AS
(
SELECT
C.Name,
Ordering = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM
#Coltable AS C
),
PrePivot AS
(
SELECT
D.Name,
RowGroup = (D.Ordering - 1) / 3,
ColumnPosition = 'col' + CONVERT(VARCHAR(10), ((D.Ordering - 1) % 3) + 1)
FROM
Data AS D
)
SELECT
P.col1,
P.col2,
P.col3
FROM
PrePivot AS V
PIVOT (
MAX(V.Name) FOR ColumnPosition IN ([col1], [col2], [col3])
) AS P
)乘以3我们可以将每个集合在一起并使用mod(/
)乘以3我们可以知道哪个列将结束该值。最后在整个组计数器中转动值(但不要显示组计数器!)。