У меня есть интересная загадка, которая, я считаю, может быть решена в чисто SQL. У меня есть таблицы, аналогичные приведенным ниже:SQL Transpose Rows as Columns
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, который кажется тем, что я хочу, но у меня возникают проблемы с его пониманием. Ссылки на лучшие статьи были бы высоко оценены!
Итак, вы говорите, что мне нужно построить динамический запрос, основанный на количестве вопросов, которые у меня есть? Думаю, я мог бы это сделать, но я надеялся на более простое решение. –
@Topher: Oracle и SQL Server имеют 'PIVOT' и' UNPIVOT', но если вы проверите тэг pivot, вы увидите, что динамические запросы являются общими даже с функцией. –
Спасибо за ответ. Похоже, это будет проще всего реализовать, даже если мне нужно сгенерировать запрос во время выполнения. –