【问题标题】:How to create columns from rows in SQL Server using dynamic SQL or pivot?如何使用动态 SQL 或数据透视从 SQL Server 中的行创建列?
【发布时间】:2016-11-07 07:15:16
【问题描述】:

我有下表数据:

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

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

我尝试了几件事,使用像 SQL Server: Examples of PIVOTing String dataCombine multiple rows into multiple columns dynamically in SQL Server 这样的旋转和动态 SQL 查询,但无法让它工作。

真正的数据是通过多个join查询的,name来自一个表,serviceName、contractNo和materialNo是从另一个表join的,列多很多,但内容是一样。

感谢您的帮助!

【问题讨论】:

  • 通过动态 SQL 应该没有问题:首先声明一个变量,该变量取 Count(distinct) 的总数,然后从 0 重复到 Var 并连接一个字符串...但问题是:以后你想如何处理这张桌子?正如您所提到的,可能有 0 到 10 列...所以也许现在您创建一个最多包含 10 列的表...明天您会收到第 11 行 - 现在呢?此外:即使您不将其存储在表格中,而是仅在某种报告中显示:该行的大小是多少?为什么不以某种表格/树的形式显示它
  • @Rene:感谢您的评论。整个东西都用在一个由 EF6 调用的存储过程中,然后显示在一个 ASPxGrid (devexpress) 中。

标签: sql-server sql-server-2008


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2014-10-16
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    相关资源
    最近更新 更多