Sql Cursor..Ques列数据作为列名称和resp下的相关应答数据。Ques栏
我有一张桌子,看起来像Sql Cursor..Ques列数据作为列名称和resp下的相关应答数据。Ques栏,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,我有一张桌子,看起来像 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 A
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行(每个账号1行)而不是4行。您不需要光标,可以使用
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)
看
或者您可以将聚合与案例一起使用
:
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
看