2012-11-01 54 views
1

枢行列我有以下表下面的示例数据在TSQL

ID Language  Question  SubQuestion  SubSubQuestion TotalCount TotalPercent 
3  E    9    0    1    88527   73% 
3  E    9    0    2    19684   16% 
3  E    9    0    3    12960   11% 
3  E    9    0    9    933    1% 

我希望所有在一排这样的

ID Language  TotalCount901 TotalPercent901  TotalCount902 TotalPercent902 TotalCount903 TotalPercent903 
    3  E   88527   73%     19684    16%    12960    11% 

我已经厌倦了使用转动命令时,但它为我工作。

+1

通过“不工作”你的意思是它抛出一个错误,给出了意外的结果,别的? – LittleBobbyTables

+1

测试小提琴:http://www.sqlfiddle.com/#!3/3a3fc/1 – mellamokb

+0

什么是分组标准?子/子问题的数量是动态的吗?由于您需要使用动态生成的SQL代码,因此使用动态数量的列进行透视很困难。您是否在使用任何种类的应用程序语言来显示您可以进行旋转的结果?对于动态列宽情况来说,这通常更容易。 – mellamokb

回答

2

我根据你的列名作了一些假设,但看起来你想用类似的东西。这不仅适用于一个UNPIVOT,然后PIVOT得到你要求的列中的值:

select * 
from 
(
    select id, 
    language, 
    col + cast(QUESTION as varchar(10)) 
     +cast(subquestion as varchar(10)) 
     +cast(SubSubQuestion as varchar(10)) col, 
    value 
    from 
    (
    select id, language, 
     cast(TotalCount as varchar(10)) TotalCount, 
     totalPercent, 
     question, subquestion, SubSubQuestion 
    from yourtable 
) usrc 
    unpivot 
    (
    value 
    for col in (totalcount, totalpercent) 
) un 
) srcpiv 
pivot 
(
    max(value) 
    for col in ([TotalCount901], [totalPercent901], 
       [TotalCount902], [totalPercent902], 
       [TotalCount903], [totalPercent903], 
       [TotalCount909], [totalPercent909]) 
) p 

SQL Fiddle with Demo

注:在执行UNPIVOT时,列必须是相同的数据类型的。如果它们不是,那么你将需要转换/转换以获得相同的数据类型。

如果你有一个未知的数值进行改造,就可以使用动态SQL:

DECLARE @query AS NVARCHAR(MAX), 
    @colsPivot as NVARCHAR(MAX) 


select @colsPivot 
    = STUFF((SELECT ',' 
      + QUOTENAME(c.name + 
         cast(QUESTION as varchar(10)) 
         +cast(subquestion as varchar(10)) 
         +cast(SubSubQuestion as varchar(10))) 
      from yourtable t 
      cross apply sys.columns as C 
      where C.object_id = object_id('yourtable') and 
       C.name in ('TotalCount', 'TotalPercent') 
      group by c.name, t.question, t.subquestion, t.subsubquestion 
      order by t.SubSubQuestion 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'select * 
       from 
       (
       select id, 
        language, 
        col + cast(QUESTION as varchar(10)) 
        +cast(subquestion as varchar(10)) 
        +cast(SubSubQuestion as varchar(10)) col, 
        value 
       from 
       (
        select id, language, 
        cast(TotalCount as varchar(10)) TotalCount, 
        totalPercent, 
        question, subquestion, SubSubQuestion 
        from yourtable 
       ) usrc 
       unpivot 
       (
        value 
        for col in (totalcount, totalpercent) 
       ) un 
      ) srcpiv 
      pivot 
      (
       max(value) 
       for col in (' + @colsPivot + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

+0

+1优秀的答案。我只会建议看起来OP会忽略SubSubQuestion = 9条目。此外,证明它可以处理多种ID和语言情况:http://sqlfiddle.com/#!3/b91b0/1 – mellamokb

+0

@mellamokb这也是我的想法,但我认为它是列名称。不确定,因为要求不是100%清楚。我只是举例说明了所有的值。 – Taryn

+0

我用过你的,但到处都是空值。我将再次查看查询,看看我是否错过了任何 – masfenix