2012-08-16 80 views
5

我有SQL Server 2008中的調查問卷數據,我想轉置爲矩陣。
我看到了幾個關於同一主題的帖子,但我只是沒有擺動。樞軸動態列,無聚合

給出的是下表:

Question table

Answer table

Customer table

列:
[CustomerID][QuestionName_1],..,[QuestionName_n] < - 動態問題列數)
的數據:
CustomerIDAnswer_1,..,Answer_n

檢索的列中的代碼:

DECLARE @columns VARCHAR(8000) 

SELECT @columns = COALESCE(@columns + ',[' + cast(QuestionName as varchar) + ']', 
'[' + cast(QuestionName as varchar)+ ']') 
FROM Answer A 
INNER JOIN Question Q ON A.QuestionID = Q.QuestionID 
INNER JOIN Customer C ON A.CustomerID = C.CustomerID 
GROUP BY Q.QuestionName 

SET @columns = '[CustomerID],' + @columns 

DECLARE @query VARCHAR(8000) 
SET @query = 'Some PIVOT query without aggregation' 

EXECUTE(@query) 

初始查詢想法是從取pivots with dynamic columns

可以這樣做,並且樞軸查詢會是什麼樣子?
ps:我不想使用具有最大列數的排名。

問候,

米歇爾

回答

15

是的,你可以執行動態支點。有時,使用靜態版本首先處理PIVOT查詢更容易,因此您可以查看查詢和結果將如何顯示。然後將查詢轉換爲動態版本。

下面是一個查詢的靜態與動態版爲例:

靜態(SQL Fiddle):

select * 
from 
(
    select u.userid, 
     u.fname, 
     u.lname, 
     u.mobile, 
     r.question, 
     r.choice 
    from users u 
    left join results r 
     on u.questionid = r.questionid 
     and u.choiceid = r.choiceid 
) x 
pivot 
(
    min(choice) 
    for question in([are you], [from]) 
) p 

動態(SQL Fiddle):

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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
      FROM results c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT userid, fname, lname, mobile, ' + @cols + ' from 
      (
       select u.userid, 
        u.fname, 
        u.lname, 
        u.mobile, 
        r.question, 
        r.choice 
       from users u 
       left join results r 
        on u.questionid = r.questionid 
        and u.choiceid = r.choiceid 
      ) x 
      pivot 
      (
       min(choice) 
       for question in (' + @cols + ') 
      ) p ' 


execute(@query) 

如果可以的話提供有關當前表結構的更多詳細信息,然後提供一些示例數據。我們應該能夠幫助您創建您的情況所需的版本。

正如我所說的,有時候從靜態版本開始比較容易,在靜態版本中,您需要首先轉換的列中進行硬編碼,然後轉到動態版本。

+0

在你的例子中,'choice'字段有什麼數據類型?我有一個varchar字段,其中包含問題的答案。 – 2012-08-16 11:29:51

+0

這是一個'varchar',如果你看SQL提琴它將顯示錶結構。 – Taryn 2012-08-16 11:31:07

+0

我有它的工作,與MIN(QuestionName)。我並不期待那樣! 感謝您的幫助藍色:)。 – 2012-08-16 12:19:15