В моей базе данных есть таблица, user_answers
, в которой хранятся ответы пользователей на ряд вопросов со строками; user_id
, question_id
, answer_id
и text_entry
. Текст вопроса и текст ответа (если есть) хранятся в справочных таблицах. Существует три типа вопросов: вопросы с одним ответом, вопросы с несколькими ответами и вопросы с текстовым ответом. Таким образом, в таблице user_answers
для одного пользователя могут быть следующие записи:
user_id question_id answer_id text_entry
------- ----------- --------- ----------
123 100 1010 (null)
123 200 2010 (null)
123 200 2030 (null)
123 300 3000 "code 789"
Допустим, таблица questions_text
имеет:
question_id text
----------- -------------
100 "Gender"
200 "Interests"
300 "Your code"
и таблица answers_text
имеет:
answer_id text
--------- -----------
1010 "Female"
1020 "Male"
2010 "Sports"
2020 "Computers"
2030 "Movies"
3000 (null)
Я хочу извлечь данные в csv с одной строкой на user_id, показывающей ответы, что-то вроде этого:
User,Gender,Sports,Computers,Movies,Code
123,Female,1,0,1,code 789
Я знаю, как генерировать файл CSV через SQLPlus (у меня есть доступ к БД через SQLPlus только по независящим от меня причинам ...), но я не знаю, как создать оператор PL / SQL.
В PL / SQL я знаю, что могу сгенерировать стержень вопроса о поле, выполнив
SELECT
user_id || ',' ||
MIN(DECODE(question_id, '100', (SELECT text FROM answers_text where answer_id = answer_text.answer_id)))
FROM user_answers
GROUP BY user_id
ORDER BY user_id
;
(я не SQL-парень, так что это скопировано из интернета!)
Этот код (по крайней мере, насколько мне подсказывает мое тестирование) хорош для вопросов с одним ответом, но не будет работать с вопросами с несколькими ответами или вопросами типа ввода текста.
В Интернете я видел кое-что об использовании оператора case
в PL / SQL, например:
MIN(CASE WHEN question_id = '200' AND answer_id = '2010' THEN '1' ELSE '0' END)
... но я не могу понять, как получить ответы в столбцах. И все вопросы, которые я могу найти, которые могут быть связаны, связаны с sql-сервером.
Есть ли способ сгенерировать желаемый результат из одного оператора PL / SQL? Желательно писать так, чтобы это не зависело от данных в таблицах, так как у нас есть ряд баз данных, на которых это может потребоваться.