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

データを 4 行ではなく 1 行 (AccNo ごとに 1 行) にするにはどうすればよいか教えてください。

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 を参照してください

または、次のように集計を使用できます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 に答える