2012-11-01 53 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