Сводная таблица MySQL

#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», чтобы я получал каждый ответ пользователя против первый ответ для этой формы. Еще раз спасибо за вашу помощь!