我根据你的列名作了一些假设,但看起来你想用类似的东西。这不仅适用于一个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