将行转换为SQL Server 2008 R2中的列
发布时间:2021-01-25 15:56:12 所属栏目:编程 来源:网络整理
导读:我怎么转这个: 和这个: 进入这个: 在SQL Server 2008 R2中? 办理要领 这个题目很是相同于 PIVOT rows to columns with more than 1 value returned,您必要将行中的字符串数据聚合到列中.我将修改该谜底,以演示怎样将数据转换为最终功效. 因为您正在聚合字
我怎么转这个: 和这个: 进入这个: 在SQL Server 2008 R2中? 办理要领这个题目很是相同于 PIVOT rows to columns with more than 1 value returned,您必要将行中的字符串数据聚合到列中.我将修改该谜底,以演示怎样将数据转换为最终功效.因为您正在聚合字符串值,因此您必要应用min()或max()聚合函数,但为了使最终功效表现多行,您必要逼迫执行多行. 为此,您必要行使row_number()为名称中的每个参数天生独一的序列号.应用PIVOT函数时,此编号将用于分组,您将天生多行: select Car,Truck,Bicycle from ( select vt.name,vp.parameter,row_number() over(partition by vt.name order by vt.id) seq from vehicle_types vt left join vehicle_parameters vp on vt.id = vp.vehicletype ) d pivot ( max(parameter) for name in (Car,Bicycle) ) piv; 见SQL Fiddle with Demo. 这也可以行使带有CASE表达式的聚合函数编写: select max(case when name = 'Car' then parameter end) Car,max(case when name = 'Truck' then parameter end) Truck,max(case when name = 'Bicycle' then parameter end) Bicycle from ( select vt.name,row_number() over(partition by vt.name order by vt.id) seq from vehicle_types vt left join vehicle_parameters vp on vt.id = vp.vehicletype ) d group by seq; 见SQL Fiddle with Demo. 假如你有一个已知数目的名称,上面两个版本是很好的,那么你可以硬编码查询,但假如你没有,那么你将不得不行使动态SQL: DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX) select @cols = STUFF((SELECT ',' + QUOTENAME(name) from vehicle_types group by id,name order by id FOR XML PATH(''),TYPE ).value('.','NVARCHAR(MAX)'),1,'') set @query = 'SELECT ' + @cols + ' from ( select vt.name,row_number() over(partition by vt.name order by vt.id) seq from vehicle_types vt left join vehicle_parameters vp on vt.id = vp.vehicletype ) x pivot ( max(parameter) for name in (' + @cols + ') ) p ' execute sp_executesql @query; 见SQL Fiddle with Demo.全部版本都给出了功效: | CAR | TRUCK | BICYCLE | |--------|------------------|------------| | make | maxload | frame | | year | hasconcretemixer | isroad | | engine | (null) | ismountain | (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读