请求编写SQL查询实现用户目标数据横向并列展示
SQL行转列:将用户关联的目标数据转为横向展示
现有用户与目标的一对多关联数据:
| User_ | Target |
|---|---|
| UserA | Target1 |
| UserA | Target2 |
| UserA | Target3 |
| UserB | Target1 |
| UserB | Target3 |
| UserB | Target6 |
需要转换为以下横向格式,每个用户一行,目标按顺序作为独立列展示:
| User | FirstTarget | SecondTarget | ThirdTarget | FourthTarget |
|---|---|---|---|---|
| UserA | Target1 | Target2 | Target3 | |
| UserB | Target1 | Target3 | Target6 |
测试表创建脚本
CREATE TABLE [dbo].[UserTarget]( [User_] [varchar](50) NULL, [Target] [varchar](50) NULL ) ON [PRIMARY] GO INSERT [dbo].[UserTarget] ([User_], [Target]) VALUES (N'UserA', N'Target1') INSERT [dbo].[UserTarget] ([User_], [Target]) VALUES (N'UserA', N'Target2') INSERT [dbo].[UserTarget] ([User_], [Target]) VALUES (N'UserA', N'Target3') INSERT [dbo].[UserTarget] ([User_], [Target]) VALUES (N'UserB', N'Target1') INSERT [dbo].[UserTarget] ([User_], [Target]) VALUES (N'UserB', N'Target3') INSERT [dbo].[UserTarget] ([User_], [Target]) VALUES (N'UserB', N'Target6') GO
实现查询语句
WITH RankedTargets AS ( SELECT User_, Target, -- 按用户分组,为每个目标分配排序序号 ROW_NUMBER() OVER (PARTITION BY User_ ORDER BY Target) AS TargetRank FROM dbo.UserTarget ) SELECT User_ AS [User], [1] AS FirstTarget, [2] AS SecondTarget, [3] AS ThirdTarget, [4] AS FourthTarget FROM RankedTargets -- 将序号对应的目标值转为横向列 PIVOT ( MAX(Target) FOR TargetRank IN ([1], [2], [3], [4]) ) AS PivotResult;
关键逻辑说明
- ROW_NUMBER():按
User_分组,对每个用户的目标进行排序并分配序号(默认按Target字段排序,需自定义顺序可调整ORDER BY子句)。 - PIVOT:将序号对应的目标值转为横向列,这里设置到第四列,若用户有更多目标可继续扩展
[5], [6]等列。 - 若用户目标数量不足指定列数,对应列会显示为
NULL。
内容的提问来源于stack exchange,提问作者Kalendar
相关产品推荐
相关产品推荐

