首页 > 解决方案 > 将单列数据拆分为多列

问题描述

微软 SQL 服务器:

我有一张如下表:

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) 中,这样继续下去。

标签: sql-server

解决方案


将您的行排序放在ORDER BY内部,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,我们可以知道该值最终会出现在哪一列。最后在整个组计数器中旋转该值(但不显示组计数器!)。


推荐阅读