我正在使用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?
更新
<aggregation function>
<column being aggregated>
提前致谢。
如果使用,则必须使用聚合函数PIVOT。但是,由于您的(RespondentId, QuestionId)组合是唯一的,因此您的“组”将只有一行,因此您可以将其MIN()用作聚合函数:
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或换句话说:聚合函数成为恒等函数。
MIN(value) = value