2013-01-10 23 views
1

我運行下面的SQL語句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 

任何人都可以用書面形式的幫助樞軸聲明?

+0

你正在使用什麼RDBMS?樞軸運算符是供應商特定的。 –

+0

是否總是隻有兩個可能的questionIDs?有一種方法可以動態編寫它,以便能夠處理任意數量的questionID。 –

+0

MS SQL Server 2008 R2 –

回答

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 
+0

特寫!正是我在找什麼!非常感謝你! –

+0

不客氣!但是,嘿,你使用的是什麼RDBMS? 'SQL Server'? 'MySQL'? 'Oracle'? ':D' –

+0

MS SQL Server 2008 R2 –

2

如果您使用的是RDBMS與PIVOT功能(SQL Server 2005的+/Oracle的),那麼你可以使用:

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)