1

次のSQLステートメントを実行しています

SELECT
 su.Id
  ,rp.QuestionId
  ,rp.AnswerId
FROM SiteUser su
  JOIN Response rp ON su.Id = rp.SiteUserId
  JOIN Answer an ON rp.AnswerId = an.Id

これにより、次の出力が生成されます

UserId    QuestionId    AnswerId
--------------------------------
1         1             1
1         2             6
2         1             2
2         2             3
3         1             2
3         2             2

以下の出力を実現したい

UserId    Question1   Question2
-------------------------------
1         1           6
2         2           3
3         2           2

誰かがピボットステートメントを書くのを手伝ってもらえますか?

4

2 に答える 2

2

関数(SQL Server 2005 + / Oracle)でRDBMSを使用している場合は、以下をPIVOT使用できます。

select Id, [1] As Question1, [2] as Question2
from
(
  SELECT su.Id
    ,rp.QuestionId
    ,rp.AnswerId
  FROM SiteUser su
  INNER JOIN Response rp 
    ON su.Id = rp.SiteUserId
  INNER JOIN Answer an 
    ON rp.AnswerId = an.Id
) src
pivot
(
  max(AnswerId)
  for QuestionId in ([1], [2])
) piv

SQL Serverを使用していて、質問IDの値の数が不明な場合は、動的SQLを使用して同じ結果を得ることができます。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT distinct ', ' + QUOTENAME(QuestionId) 
                    from Response 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsFinal = STUFF((SELECT distinct ', ' + QUOTENAME(QuestionId) + ' as Question'+QuestionId 
                    from Response 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @colsFinal + ' from 
             (
                SELECT su.Id
                  ,rp.QuestionId
                  ,rp.AnswerId
                FROM SiteUser su
                INNER JOIN Response rp 
                  ON su.Id = rp.SiteUserId
                INNER JOIN Answer an 
                  ON rp.AnswerId = an.Id
            ) src
            pivot 
            (
                max(AnswerId)
                for QuestionId  in (' + @colsPivot + ')
            ) p '

execute(@query)
于 2013-01-10T15:35:29.277 に答える
1

RDBMSについて言及していないため、以下のこのクエリはほとんどすべてのRDBMSで機能します。

SELECT  su.Id,
        MAX(CASE WHEN rp.QuestionId = 1 THEN rp.AnswerId ELSE NULL END) Question1,
        MAX(CASE WHEN rp.QuestionId = 2 THEN rp.AnswerId ELSE NULL END) Question2
FROM    SiteUser su
        INNER JOIN Response rp 
            ON su.Id = rp.SiteUserId
        INNER JOIN Answer an 
            ON rp.AnswerId = an.Id
GROUP BY su.Id
于 2013-01-10T15:32:27.723 に答える