如何从SQL转换结果集
我正在使用Microsoft SQL Server 2008。如何从SQL转换结果集,sql,sql-server-2008,Sql,Sql Server 2008,我正在使用Microsoft SQL Server 2008。 我有一张像这样的桌子: |======================================================| | RespondentId | QuestionId | AnswerValue | ColumnName | |======================================================| | P123 | 1 |
我有一张像这样的桌子:
|======================================================|
| 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 |
|-------------------------------------------------|
我希望将行翻转为列,以便此表如下所示:
|======================================================|
| 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 |
|-------------------------------------------------|
(这里的示例数据是任意编造的,因此很愚蠢)
源表是一个临时表,大约有70000行。要做到这一点,我需要编写什么样的SQL?
更新
- 我甚至不知道PIVOT是否是正确的方式
- 我不知道该关注哪一个专栏
- 文档中提到了
和
,我不想汇总任何内容李>
提前谢谢。看看你是否能开始。过去必须使用用例语句才能实现这一点,但现在看来SQL Server中已经有了PIVOT的一些线索。PIVOT是一个开始,但SQL查询的问题是,在编写查询之前,您确实需要知道结果集中需要哪些列。如果您不知道这一点,上次我检查时,您必须求助于动态sql或允许检索数据的客户端应用程序执行透视。如果您使用
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
,或者换句话说:聚合函数成为标识函数。您是否查看了透视
?根据我对PIVOT
命令的了解,您必须使用聚合函数。我不想要一个聚合函数,我只想要值被翻转。有固定数量的列(65个-每个调查问题一个),只是它们的名称被存储为数据。在这种情况下,pivot应该做您需要做的事情,但您必须在您的选择列表中为每个列输入一个条目