2013-08-02 117 views
1

我在SQL Server中有一個表,它存儲了我們網站上調查問卷和答案的列表。這是一個相當標準的佈局,這裏是它的存儲完成的調查:水平查詢返回列

Name   Question      Answer 
James Smith What is your address?   23 Duck Ln. 
James Smith How old are you?    48 
James Smith Do you have a job?    yes 
Sarah Murphy What is your address?   44 West St. 
Sarah Murphy How old are you?    23 
Sarah Murphy Do you have a job?    no 
Jack Western What is your address?   PO Box 17 
Jack Western Do you have a job?    yes 

正如你所看到的,這是很難一次幾個調查完成讀取數據。我需要水平返回值,每個人只有一行第一列包含人的姓名,其他行每個都包含一個問題作爲標題,以及其下的答案。以下是查詢返回值的方式:

Name   What is your address? How old are you? Do you have a job? 
James Smith 23 Duck Ln.    48     yes 
Sarah Murphy 44 West St.    23     no 
Jack Western PO Box 17         yes 

這可能嗎?順便說一下,我只發佈了一些問題 - 如果網站上有超過10個問題,它會變得更大。

感謝您的幫助!

編輯:

請不要集中在是否應該記錄在應用層進行解析。我最終希望使用R中的輸出,這甚至不是用來處理大型數據集的。

+0

不,那是你的應用程序應該如何顯示的值。數據庫的工作是存儲和檢索數據,而不是將其格式化以供顯示。在應用程序代碼中執行此轉換,而不是SQL。 –

回答

7

如果你想,因爲你使用的是SQL Server,您可以使用旋轉功能,從行變換的數據列在SQL執行此:

select name, 
    [What is your address?], 
    [How old are you?], 
    [Do you have a job?] 
from yourtable 
pivot 
(
    max(answer) 
    for question in ([What is your address?], [How old are you?], [Do you have a job?]) 
) piv; 

SQL Fiddle with Demo

如果你有一個未知的值,那麼你可以使用動態SQL來獲取解決方案:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Question) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT name, ' + @cols + ' 
      from yourtable 
      pivot 
      (
       max(answer) 
       for Question in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo

+0

已投票 - 很好的答案。到目前爲止,我還沒有意識到SQL小提琴,感謝這個學習資源! – dingalingchickenwiing