2009-04-24 76 views
1

源表:的SQL Server PIVOT幫助

Create Table ExamAnswers 
{ 
    StudentID varchar(12), 
    QuestionID int, 
    Answer char(1) 
} 

,這將充滿

Bob 1 a 
Bob 2 c 
... 
Bob 100 b 
Chris 1 c 
Chris 2 d 
... 
Chris 100 null 

等,約500名學生。

Chris沒有完成考試,但第100個問題被存儲爲空,因此可以保證每個學生都有100行,但實際答案爲空或字符。

如果這有什麼差別,答案是{A,B,C,d,E,F}

這種設置對於實際考試申請的偉大工程,並將其標記是微不足道的。

現在我有一個報告要求,對於審計的目的,我需要製作一個表格,看起來像這樣:

ID 1 2 ... 100 
Bob a c ... b 
Chris c d ....null 

所以我花了半天時間閱讀有關旋轉功能,我只是不沒辦法。

這是我讀過的最難讀的文檔。

首先,它需要和聚合函數 - 我應該在這裏聚合到底是什麼?

我想,這僅僅是對最簡單的使用旋轉功能,有可能是的,我不能在任何地方找到一個體面的例子。幫幫我!

回答

1

確定解決它。 MAX或MIN將在char字段上工作。 所以:

Create Table ExamAnswers 
{ 
    StudentID varchar(12), 
    QuestionID int, 
    Answer char(1) 
} 

由於最初創建

然後

SELECT StudentID, [1] as Q1, [2] as Q2, [3] as Q3, [4] as Q4, [5] as Q5 
FROM 
(
SELECT StudentID, QuestionID, Answer 
FROM dbo.ExamAnswers 
) AS piv 
PIVOT 
(
MAX(Answer) 
FOR QuestionID IN ([1], [2], [3], [4], [5]) 
) AS chld 

混亂奠定在一個聚合的選擇那裏是聚集沒有任何合乎邏輯的理由。我應該提到StudentID和QuestionID形成一個複合鍵,因此對於任何給定的SID和QID對,只有一個可能的Answer值。

3

看看這篇文章: Using PIVOT and UNPIVOT

報價:

The following is annotated syntax for PIVOT. 

SELECT <non-pivoted column> , 

    [first pivoted column] AS <column name> , 

    [second pivoted column] AS <column name> , 

    ... 

    [last pivoted column] AS <column name> 

FROM 

    (<SELECT query that produces the data>) 

    AS <alias for the source query> 

PIVOT 

( 

    <aggregation function>(<column being aggregated>) 

FOR 

[<column that contains the values that will become column headers>] 

    IN ([first pivoted column] , [second pivoted column] , 

    ... [last pivoted column]) 

) AS <alias for the pivot table> 

<optional ORDER BY clause> 

正如你可以看到有一定的聚集功能(列被聚合)。 因此,表中的Answer列必須是整數(小數等),而不是char(1)。

EDIT:MIN()和MAX()爲char()數據類型工作。

你的表可以是這樣的:

Create Table ExamAnswers 
(
    StudentID varchar(12) NOT NULL, 
    QuestionID int NOT NULL, 
    Answer int 
) 

和SELECT語句PIVOT,那給你需要將結果:

SELECT StudentID, [1] as Q1, [2] as Q2, [3] as Q3, [4] as Q4, [5] as Q5 
FROM 
(
SELECT StudentID, QuestionID, Answer 
FROM dbo.ExamAnswers 
) AS piv 
PIVOT 
(
AVG(Answer) 
FOR QuestionID IN ([1], [2], [3], [4], [5]) 
) AS chld 
+0

Answer是一封信。它不是一個整數。我不能寫封信。我不能SUM一個,我不想要一個COUNT。如果這封信是'a',我希望看到'a'。爲什麼這很難? – 2009-04-25 02:15:35