1

源表:

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 个问题存储为 null,因此可以保证每个学生正好有 100 行,但实际答案是 null 或字符。

如果有任何区别,答案在 {a,b,c,d,e,f}

此设置非常适合实际的考试应用程序,并且标记它是微不足道的。

现在我有一个报告要求,出于审计目的,我需要生成一个如下所示的表格:

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

所以我花了半天时间阅读 PIVOT 功能,我就是不明白。

那一定是我读过的最难以理解的文档。

一方面,它需要和聚合函数——我到底应该在这里聚合什么?

我认为这只是可能存在的 PIVOT 函数的最简单用法,而且我在任何地方都找不到像样的示例。帮助!

4

2 回答 2

3

看这篇文章: 使用 PIVOT 和 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>

如您所见,必须有聚合函数(正在聚合的列)。因此,表中的答案列必须是整数(十进制等),而不是 char(1)。

编辑: MIN() 和 MAX() 适用于 char() 数据类型。

你的表可以是这样的:

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

和 PIVOT 的 SELECT 语句,给出你需要的结果将是:

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
于 2009-04-24T23:57:40.637 回答
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 值。

于 2009-04-27T15:04:27.540 回答