如何使用动态SQL或数据透视表从SQL Server中的行创建列?

时间:2016-07-05 12:35:12

标签: sql-server sql-server-2008

我有以下表格数据:

name | serviceName | contractNo | materialNo
--------------------------------------------
item1  managed foo   123456       A6Ax33444
item1  managed bar   534454       A6A3222x7

这就是我需要的结果:

name | serviceName1 | contractNo1 | materialNo1 | serviceName2 | contractNo2 | materialNo2
item1  managed foo    123456        A6Ax33444     managed bar    534454        A6A3222x7

此示例仅包含两个服务名称,但可能有零到大约10个不同的服务。

我使用像SQL Server: Examples of PIVOTing String dataCombine multiple rows into multiple columns dynamically in SQL Server这样的数据透视和动态SQL查询尝试了几件事,但无法使其发挥作用。

使用多个联接查询真实数据,' name'来自一个表,' serviceName',' contractNo'和' materialNo'从另一个加入,并且那里有更多的列,但内容是相同的。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这里我只给出了两行的解决方案。试试这个。

如果适合您,您必须尝试更多。

select d.name
    ,max(case when Rn = 1 then cast(ServiceName as NVARCHAR) end) ServiceName1
    ,max(case when Rn = 1 then cast(ContractNo as NVARCHAR) end) ContractNo1
    ,max(case when Rn = 1 then cast(MeterialNo as NVARCHAR) end) MeterialNo1
    ,max(case when Rn = 2 then cast(ServiceName as NVARCHAR) end) ServiceName2
    ,max(case when Rn = 2 then cast(ContractNo as NVARCHAR) end) ContractNo2
    ,max(case when Rn = 2 then cast(MeterialNo as NVARCHAR) end) MeterialNo2
from (
select *
,ROW_NUMBER() over(PARTITION BY name ORDER BY(select null)) Rn
from your_Table
)d
group by d.name