我根據你的列名作了一些假設,但看起來你想用類似的東西。這不僅適用於一個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
通過「不工作」你的意思是它拋出一個錯誤,給出了意外的結果,別的? – LittleBobbyTables
測試小提琴:http://www.sqlfiddle.com/#!3/3a3fc/1 – mellamokb
什麼是分組標準?子/子問題的數量是動態的嗎?由於您需要使用動態生成的SQL代碼,因此使用動態數量的列進行透視很困難。您是否在使用任何種類的應用程序語言來顯示您可以進行旋轉的結果?對於動態列寬情況來說,這通常更容易。 – mellamokb