Cursor.Ques列数据为resp下的列名和相关答案数据。问题专栏

时间:2012-09-19 21:18:40

标签: 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  Ans3  Ans4

我已经写了一个光标,但我的输出看起来像下面的

AccNo       Person    Q1    Q2    Q3    Q4
1           XXX       Ans1          
1           XXX             Ans2        
1           XXX                   Ans3  
1           XXX                         Ans4

请让我知道如何将数据分成1行(每个AccNo 1行)而不是4行。

1 个答案:

答案 0 :(得分: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 with Demo

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

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 with Demo

或者您可以使用带有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 with Demo