问题描述
如果使用,则必须使用聚合函数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
或换句话说:聚合函数成为恒等函数。
解决方法
我正在使用Microsoft SQL Server2008。
我有一个看起来像这样的表:
|======================================================|
| 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>
并且我不想汇总任何内容。
提前致谢。