如何将Product表的多行查询结果转换为单行多列的重复列结构?
把SQL Server Product表多行结果转成单行多列的解决方案
嘿,我来帮你搞定这个多行转单行多列的需求!刚好你的Product表有固定4条数据,咱们用行号配合条件聚合的方式就能轻松实现,直接上代码和说明:
原表结构与示例数据
先确认下你的表结构和测试数据(方便复现):
CREATE TABLE [dbo].[Product]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](max) NOT NULL, [Price] [int] NOT NULL, [Qty] [int] NOT NULL ) -- 插入示例数据 INSERT INTO [dbo].[Product] ([Name], [Price], [Qty]) VALUES ('NIKE', 600, 1), ('ADIDAS', 500, 2), ('Skechers', 400, 5), ('FILA', 250, 10)
实现查询语句
这个方法的核心是先给每条记录标记行号,再用条件聚合把每行的字段映射到单行的多列中:
SELECT MAX(CASE WHEN rn = 1 THEN Name END) AS Name, MAX(CASE WHEN rn = 1 THEN Price END) AS Price, MAX(CASE WHEN rn = 1 THEN Qty END) AS Qty, MAX(CASE WHEN rn = 2 THEN Name END) AS Name, MAX(CASE WHEN rn = 2 THEN Price END) AS Price, MAX(CASE WHEN rn = 2 THEN Qty END) AS Qty, MAX(CASE WHEN rn = 3 THEN Name END) AS Name, MAX(CASE WHEN rn = 3 THEN Price END) AS Price, MAX(CASE WHEN rn = 3 THEN Qty END) AS Qty, MAX(CASE WHEN rn = 4 THEN Name END) AS Name, MAX(CASE WHEN rn = 4 THEN Price END) AS Price, MAX(CASE WHEN rn = 4 THEN Qty END) AS Qty FROM ( -- 子查询:给每条数据按ID排序添加行号,保证顺序和示例一致 SELECT Name, Price, Qty, ROW_NUMBER() OVER (ORDER BY ID) AS rn FROM [dbo].[Product] ) AS ranked_products
小说明
- 子查询里的
ROW_NUMBER() OVER (ORDER BY ID)是为了给每行数据分配唯一的行号,确保我们能准确对应到原表的4条记录; - 外层的
MAX(CASE...)用来提取对应行号的字段值,因为我们要把所有行聚合到一行,用MAX(或者MIN,这里每个行号对应唯一值,效果相同)就能精准拿到目标值; - 如果你担心重复列名在某些工具里有问题,也可以把列名改成
Name1、Price1这种带序号的形式,可读性会更好。
内容的提问来源于stack exchange,提问作者user2837480
相关产品推荐
相关产品推荐

