Tsql 如何将行转换为列

Tsql 如何将行转换为列,tsql,ssrs-2008-r2,Tsql,Ssrs 2008 R2,我有一个表格,其中包含类型、默认值、中断、CRG、会议、培训、专家、个人、特殊项目和系统中断水平排列。我需要把它放在一个饼图中,每个图表都是通过数据集按类别过滤的。我遇到的问题是,默认、中断、CRG、会议、培训、专家、个人、特殊项目和系统中断在水平布局中,我需要垂直布局。我尝试了Unpivot,但无法使其与9个字段一起工作。见下文 我需要的饼图的预期结果是:也许这就是您要找的 Declare @YourTable table (Type varchar(50),[Default] int,[

我有一个表格,其中包含类型、默认值、中断、CRG、会议、培训、专家、个人、特殊项目和系统中断水平排列。我需要把它放在一个饼图中,每个图表都是通过数据集按类别过滤的。我遇到的问题是,默认、中断、CRG、会议、培训、专家、个人、特殊项目和系统中断在水平布局中,我需要垂直布局。我尝试了Unpivot,但无法使其与9个字段一起工作。见下文


我需要的饼图的预期结果是:

也许这就是您要找的

Declare @YourTable table (Type varchar(50),[Default] int,[Break] int,CRG int,Meeting int,Training int,Specialist int,Personal int,SpecialProjects int,SystemOutage int)
Insert into @YourTable values
('Category1',32721,40634,0,1348,9162,0,10212,44549,17090),
('Category2',261997,83567,0,0,552312,0,17859,59345,30138)

Select B.*
 From  (Select Type,XMLData=cast((Select A.* for XML Raw) as xml) From @YourTable A) A
 Cross Apply (
                Select Type   = r.value('@Type','varchar(50)')
                      ,Item   = attr.value('local-name(.)','varchar(100)')
                      ,Value  = attr.value('.','int') 
                 From  XMLData.nodes('/row') as A(r)
                 Cross Apply A.r.nodes('./@*') AS B(attr)
                 Where attr.value('local-name(.)','varchar(100)') not in ('Type')
             ) B
 Where A.Type='Category1'
返回


谢谢你,约翰。我重新评估了我的代码并添加了UNPIVOT,它可以工作。@请参阅本机UNPIVOT或此解决方案。如果是本机的,速度会更快,只需要定义字段。我使用这种技术来实现更动态的方法。如果没有别的,请把这个答案放在你的后口袋里,我从中得到了很多好处(作为一个懒惰的程序员)