#mysql #sql #pivot-table #crosstab
#mysql #sql #сводная таблица #перекрестная таблица
Вопрос:
В течение последних нескольких дней я пытался найти ответ на эту проблему. Хотя я не нашел ответа, этот сайт продолжает появляться в результатах моего поиска, поэтому я подумал, что попробую. Кстати, потрясающие варианты форматирования для сообщений.
У меня есть таблица, подобная:
user_id | form_id | question_id | data_label | data_value
1 1 1 firstName Joe
1 1 2 lastName Smith
1 1 3 phone 5554443333
2 1 1 firstName Sally
2 1 2 lastName Jones
2 1 3 phone 3334445555
которую я хочу превратить в:
user_id | firstName | lastName | phone
1 Joe Smith 5554443333
2 Sally Jones 3334445555
Я могу найти пример того, как это сделать. Я не очень хорошо в них разбираюсь, но они существуют. Моя уникальная проблема вступает в силу, когда эта единственная таблица содержит данные, введенные из множества форм с любым возможным количеством полей. Итак, у меня может быть таблица с:
user_id | form_id | question_id | data_label | data_value
1 1 1 firstName Joe
1 1 2 lastName Smith
1 1 3 phone 5554443333
2 1 1 firstName Sally
2 1 2 lastName Jones
2 1 3 phone 3334445555
3 2 1 fav_color red
3 2 2 fav_animal eagle
4 2 1 fav_color blue
4 2 2 fav_animal dog
Затем я передам form_id в качестве параметра, соберу все записи из этой формы, сгруппированные пользователями (все они должны иметь одинаковые метки с разными значениями), а затем выведу эти данные в виде:
…когда form_id = 1, отчет выглядит следующим образом:
user_id | firstName | lastName | phone
1 Joe Smith 5554443333
2 Sally Jones 3334445555
…при form_id = 2 отчет выглядит следующим образом:
user_id | fav_color | fav_animal
3 red eagle
4 blue dog
Я новичок в продвинутом программировании и процедурах SQL и не могу понять, как это сделать самостоятельно. Мне нужно, чтобы запрос мог обрабатывать любое количество / тип полей без необходимости вводить точные возможные имена полей в запрос для каждой формы. Обратите внимание, что первый запрос, приведенный непосредственно выше, содержит четыре поля, а второй — 3. Таким образом, решение должно быть гибким в этом отношении.
SQL также может быть сгенерирован на языке программирования, поэтому с этим решением есть больше вариантов, если это поможет.
Пожалуйста, сообщите мне, если у вас недостаточно информации.
Ответ №1:
Вы могли бы попробовать (непроверенный) что-то вроде
select form_id,
max(case data_label when 'lastName' then data_value else null end) as lastname,
max(case data_label when 'firstName' then data_value else null end) as firstname,
max(case data_label when 'phone' then data_value else null end) as phone
from mytable
group by form_id
Комментарии:
1. Спасибо за ваш ответ. Не могу поверить, что я не видел этого до сих пор, но поскольку я могу создать инструкцию SQL программно, я могу сначала запросить данные для имен полей, а затем динамически создать инструкцию SQL, которую вы предоставили для каждого типа формы. Единственным изменением, которое я внес в приведенное выше утверждение, было изменение «group by form_id» на «group by user_id», чтобы я получал каждый ответ пользователя против первый ответ для этой формы. Еще раз спасибо за вашу помощь!