sql-server - 将单列数据拆分为多列
问题描述
微软 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) 中,这样继续下去。
解决方案
将您的行排序放在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,我们可以知道该值最终会出现在哪一列。最后在整个组计数器中旋转该值(但不显示组计数器!)。
推荐阅读
- reactjs - 如何处理ant design动态字段中的单选按钮
- android - android webRTC voice call
- javascript - 我尝试散列密码但收到错误
- json - 在消息 GRPC 中设置 Json 类型
- javascript - 在哪里可以找到 Blazor javascript 函数文档
- entity-framework-core - 在 Code First 场景中,List 项的 ParentID 为 null
- laravel - 带有 Inertia JS 的 Spatie Laravel 翻译加载器
- python - Google Colab:从另一个 python 文件调用函数
- javascript - 如何在 VSCode 中禁用除当前编辑文件语言之外的其他语言的片段
- apache-dolphinscheduler - apache dolphinscheduler--ApiExceptionHandler:41 - null org.eclipse.jetty.io.EofException: null