如何将SQL查询结果集转置

8

我正在使用微软 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。
  • 文档提到了<聚合函数><被聚合的列>,而我并不想聚合任何内容。

先感谢您的帮助。


2
你看过 PIVOT 吗?http://msdn.microsoft.com/zh-cn/library/ms177410.aspx - Neil Knight
从我所见到的PIVOT命令来看,你必须使用一个聚合函数。我不想要一个聚合函数,我只想把值翻转过来。 - funkymushroom
3个回答

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

看看this是否能帮助你入门。以前必须使用CASE语句才能实现,但现在SQL Server中似乎有一些PIVOT的迹象。


0

PIVOT是一个好的开始,但是在SQL查询中,你真的需要在编写查询之前知道结果集中期望的列。如果你不知道这一点,最后一次我检查过,你要么使用动态SQL,要么允许检索数据的客户端应用程序来执行Pivot。


有一定数量的列(65列 - 每个调查问题一个列),只是它们的名称作为数据存储。 - funkymushroom
在这种情况下,枢轴应该实现你需要的功能,但是你需要为每一列在选择列表中放入一个条目。 - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接