使用相同属性的“列表”转置表

时间:2012-12-19 12:58:49

标签: sql postgresql crosstab transpose relational-division

是否可以转置具有重复列的表?

现有表格:

user_id    question_id   body 
1          1             'Text1 1'
1          1             'Text1 1-2'
1          2             'Text1 2'
1          3             'Text1 3'
2          1             'Text2 1'
2          2             'Text2 2'

基于

的交叉表或解决方案
MAX(CASE WHEN r.question_id = 1 THEN r.body ELSE NULL END) AS 'question1'

不适用于此方案,因为始终匹配重复属性的最后一次出现。

我想在问题主体上进行搜索,但我不知道如何没有换位表 例如。我想在question1='...' AND question2='...'

中找到user_id

1 个答案:

答案 0 :(得分:1)

这是关系划分的情况。获得所需内容的两种示例查询技术:

SELECT user_id
FROM   tbl
WHERE  question_id = 1
AND    body = 'Text1 1'

INTERSECT
SELECT user_id
FROM   tbl
WHERE  question_id = 2
AND    body = 'Text1 2';

或者:

SELECT t1.user_id
FROM   tbl t1
JOIN   tbl t2 USING (user_id)
WHERE  t1.question_id = 1
AND    t1.body = 'Text1 1'
AND    t2.question_id = 2
AND    t2.body = 'Text1 2';

-> sqlfiddle demo

在此相关问题下找到更多:
How to filter SQL results in a has-many-through relation

来自附加模块tablefunc

crosstab()只是一种以修改方式显示数据的方法。但是你正在寻找一种查询技术。这不是显示问题 您也可以在crosstab()上找到{{1}}的许多示例,a search like this one