2016-07-05 40 views
0

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

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查询SQL Server: Examples of PIVOTing String dataCombine multiple rows into multiple columns dynamically in SQL Server,但无法让它工作。

使用多个连接查询实际数据,'name'来自一个表,'serviceName','contractNo'和'materialNo'是从另一个连接的,并且有更多的列,但内容是一样。

感谢您的帮助!

+0

不应有在通过动态SQL做一个问题:首先声明一个变量,这需要计数的总数(不同)和thenrepeat从0到变数和Concat的一个字符串...但问题是:您以后如何处理表格?正如你所提到的,有可能有0到10列......所以也许现在你创建一个最多10列的表......明天你会得到第11排 - 现在呢?此外:即使你不把它存储在一个表中,但只显示在某种报告中:该行的大小是多少?为什么不以某种形式的表/树显示它 – Tyron78

+0

@ Rene:感谢您的评论。整个东西用于EF6调用的存储过程,然后显示在ASPxGrid(devexpress)中。 – Jan

回答

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 
相关问题