3

我有一张看起来像的桌子

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 行。

4

1 回答 1

3

您不需要光标,您可以使用PIVOT. 如果您知道要转换的行数,则可以通过静态数据透视对其进行硬编码:

select *
from 
(
    select accNo, person, ques, anwers
    from yourtable
) x
pivot
(
    min(anwers)
    for ques in([Q1], [Q2], [Q3], [Q4])
) p

请参阅带有演示的 SQL Fiddle

如果您不知道要转换的列数,则可以使用动态枢轴:

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)

请参阅带有演示的 SQL Fiddle

或者您可以使用带有 a 的聚合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

请参阅带有演示的 SQL Fiddle

于 2012-09-19T21:22:12.917 回答