我正在使用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才能做到这一点?
更新
<aggregation function>
和<column being aggregated>
,我不想聚合任何内容。 提前致谢。
答案 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或允许检索数据的客户端应用程序来执行数据透视。