Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从SQL转换结果集_Sql_Sql Server 2008 - Fatal编程技术网

如何从SQL转换结果集

如何从SQL转换结果集,sql,sql-server-2008,Sql,Sql Server 2008,我正在使用Microsoft SQL Server 2008。 我有一张像这样的桌子: |======================================================| | RespondentId | QuestionId | AnswerValue | ColumnName | |======================================================| | P123 | 1 |

我正在使用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    | 
|-------------------------------------------------|
我希望将行翻转为列,以便此表如下所示:

|======================================================|
| 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应该做您需要做的事情,但您必须在您的选择列表中为每个列输入一个条目