我有一张类似
的表格AccNo Person Ques Anwers
1 XXX Q1 A1
1 XXX Q2 A2
1 XXX Q3 A3
1 XXX Q4 A4
我需要编写一个代码,以便我的输出看起来像这样..
AccNo Person Q1 Q2 Q3 Q4
1 XXX Ans1 Ans2 Ans3 Ans4
我已经写了一个光标,但我的输出看起来像下面的
AccNo Person Q1 Q2 Q3 Q4
1 XXX Ans1
1 XXX Ans2
1 XXX Ans3
1 XXX Ans4
请让我知道如何将数据分成1行(每个AccNo 1行)而不是4行。
答案 0 :(得分:3)
您不需要光标,可以使用PIVOT
。如果您知道要转换的行数,可以通过静态数据透视表对其进行硬编码:
select *
from
(
select accNo, person, ques, anwers
from yourtable
) x
pivot
(
min(anwers)
for ques in([Q1], [Q2], [Q3], [Q4])
) p
如果您不知道要转换的列数,则可以使用动态数据透视:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ques)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT accno, person,' + @cols + ' from
(
select accNo, person, ques, anwers
from yourtable
) x
pivot
(
min(anwers)
for ques in (' + @cols + ')
) p '
execute(@query)
或者您可以使用带有CASE
的汇总:
select accno, person,
max(case when ques = 'Q1' then anwers end) Q1,
max(case when ques = 'Q2' then anwers end) Q2,
max(case when ques = 'Q3' then anwers end) Q3,
max(case when ques = 'Q4' then anwers end) Q4
from yourtable
group by accno, person