Is it possible to transpose a table with repeated columns?
Existing table:
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'
Cross tab or solution based on
MAX(CASE WHEN r.question_id = 1 THEN r.body ELSE NULL END) AS 'question1'
is not applicable in this scenario because always is match last occurance of repeated attribute.
I want to perform search on the question body but I don’t know how without a transposed table.
E.g. I want to find user_id where question1='...' AND question2='...'
Advertisement
Answer
This is a case of relational division. Two example query techniques to get what you want:
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';
Or:
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';
Find many more under this related question:
How to filter SQL results in a has-many-through relation
crosstab()
from the additional module tablefunc is just a way to display your data in a modified way. But you are looking for a query technique. It’s not a display issue.
You can find many examples for crosstab()
here on SO, too, with a search like this one.