我有一个有趣的难题,我相信可以在纯SQL中解决。我有类似的表如下:SQL将行转换为列
responses:
user_id | question_id | body
----------------------------
1 | 1 | Yes
2 | 1 | Yes
1 | 2 | Yes
2 | 2 | No
1 | 3 | No
2 | 3 | No
questions:
id | body
-------------------------
1 | Do you like apples?
2 | Do you like oranges?
3 | Do you like carrots?
,我想获得以下输出
user_id | Do you like apples? | Do you like oranges? | Do you like carrots?
---------------------------------------------------------------------------
1 | Yes | Yes | No
2 | Yes | No | No
我不知道有多少的问题就会出现,并且他们将是动态的,所以我不能只为每个问题编码。我使用PostgreSQL,我相信这被称为转置,但我似乎无法找到任何说SQL的标准方式。我记得在我的大学数据库课上做这个,但是它在MySQL中,我真的不记得我们是如何做到的。
我假设它将是一个连接和一个GROUP BY
声明的组合,但我甚至不知道如何开始。
任何人都知道如何做到这一点?非常感谢!
编辑1:我发现了一些关于使用crosstab的信息,这似乎是我想要的,但我无法理解它。更好的文章链接将不胜感激!
所以你说我必须建立一个动态查询基于我有多少个问题?我想我可以做到这一点,但我希望有一个更简单的解决方案。 – 2010-01-20 05:28:31
@Topher:Oracle和SQL Server有'PIVOT'和'UNPIVOT',但是如果你检查pivot标签,你会发现动态查询在使用这个函数时是很常见的。 – 2010-01-20 05:33:35
感谢您的回答。看起来这将是最容易实现的,即使我必须在运行时生成查询。 – 2010-01-20 05:40:47