如何从SQL转置结果集

时间:2011-08-09 19:50:03

标签: sql sql-server-2008

我正在使用Microsoft SQL Server 2008.
我有一张看起来像这样的表:

|======================================================|
| RespondentId | QuestionId | AnswerValue | ColumnName | 
|======================================================|
|     P123     |      1     |     Y       | CanBathe   |
|------------------------------------------------------|
|     P123     |      2     |     3       | TimesADay  |
|------------------------------------------------------|
|     P123     |      3     |     1.00    | SoapPrice  |
|------------------------------------------------------|
|     P465     |      1     |     Y       | CanBathe   |
|------------------------------------------------------|
|     P465     |      2     |     1       | TimesADay  |
|------------------------------------------------------|
|     P465     |      3     |     0.99    | SoapPrice  |
|------------------------------------------------------|
|     P901     |      1     |     N       | CanBathe   |
|------------------------------------------------------|
|     P901     |      2     |     0       | TimesADay  |
|------------------------------------------------------|
|     P901     |      3     |     0.00    | SoapPrice  |
|------------------------------------------------------|

我想将行翻转为列,以便此表格如下所示:

|=================================================|
| RespondentId | CanBathe | TimesADay | SoapPrice | 
|=================================================|
|     P123     |     Y    |      3    |   1.00    | 
|-------------------------------------------------|
|     P465     |     Y    |      1    |   0.99    | 
|-------------------------------------------------|
|     P901     |     N    |      0    |   0.00    | 
|-------------------------------------------------|

(此处的示例数据是任意组成的,所以很愚蠢)

源表是一个临时表,大约有70,000行 我需要写什么SQL才能做到这一点?

更新

  • 我甚至不知道PIVOT是否是正确的选择。
  • 我不知道PIVOT上有什么专栏。
  • 文档提及<aggregation function><column being aggregated>,我不想聚合任何内容。

提前致谢。

3 个答案:

答案 0 :(得分:7)

如果您使用PIVOT,则需要使用聚合函数。但是,由于您的(RespondentId, QuestionId)组合是唯一的,因此您的“群组”只有一行,因此您可以将MIN()用作汇总函数:

SELECT RespondentId, CanBathe, TimesADay, SoapPrice
FROM (SELECT RespondentId, ColumnName, AnswerValue FROM MyTable) AS src
PIVOT (MIN(AnswerValue) FOR ColumnName IN(CanBathe, TimesADay, SoapPrice)) AS pvt

如果一个组只包含一行,那么MIN(value) = value,或换句话说:聚合函数成为标识函数。

答案 1 :(得分:1)

查看this是否可以帮助您入门。过去必须使用CASE语句来实现这一点,但现在看起来PIVOT的一些内容现在在SQL Server中。

答案 2 :(得分:0)

PIVOT是一个开始,但是sql查询的事情是你真的需要知道在编写查询之前结果集中期望的列。如果您不知道这一点,我上次检查时您必须使用动态sql或允许检索数据的客户端应用程序来执行数据透视。