rmgrodrigues Ответов: 1

Mysql запрос с динамическими именами столбцов


У меня есть запрос mysql,который дает мне все результаты.

SELECT `respondents`.`session_id`, `answers`.`respondent_id`, `answers`.`question_id`, `respondents`.`center_id`, `respondents`.`survey_id`, `respondents`.`end_date`, `answervalues`.`spss_name`, `answervalues`.`answer_id`, `answervalues`.`value`, `answervalues`.`district_code`, `answervalues`.`county_code`, `answervalues`.`option`, `answervalues`.`is_answer`, (
SELECT COUNT(*)
FROM answervalues
WHERE answer_id = answers.id AND is_answer = 1) AS has_answer
FROM `answervalues`
INNER JOIN `answers` ON `answers`.`id` = `answervalues`.`answer_id`
INNER JOIN `respondents` ON `respondents`.`id` = `answers`.`respondent_id`
WHERE `respondents`.`center_id` IN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '28', '29', '30', '32') AND `respondents`.`survey_id` IN ('2', '3', '4', '5', '6', '7', '8') AND `answers`.`question_id` IN ('8', '24', '58', '74', '83', '94', '106', '9', '25', '59', '75', '95', '107', '155', '10', '26', '60', '96', '108', '154', '156', '11', '27', '61', '76', '84', '97', '109', '14', '28', '62', '77') AND `respondents`.`end_date` IS NOT NULL AND `respondents`.`end_date` >= '2016-01-01 00:00:00' AND `respondents`.`end_date` <= '2016-05-31 23:59:59'
ORDER BY `respondents`.`session_id` ASC, `respondents`.`survey_id` ASC, `answers`.`question_number` ASC, `answervalues`.`spss_name` ASC


Я хочу выполнить запрос, в котором результаты группируются по "responsivers.session_id", а столбцы создаются динамическими по результату поля [answervalues].[spss_name] и значения для строк - это [answervalues].[значение] или если оно равно нулю, то значения должны быть из [answervalues].[вариант]. Никаких вычислений для этих значений не требуется.

Спасибо вам всем.

Что я уже пробовал:

Создайте новую таблицу с результатами запроса и экспортируйте ее в csv-файл. Но так как данные слишком велики, то работать в excel невозможно.

Suvendu Shekhar Giri

Что вы до сих пор пытались сделать для достижения хорошо объясненного требования?

rmgrodrigues

Создайте новую таблицу с результатами запроса и экспортируйте ее в csv-файл. Но так как данные слишком велики, то работать в excel невозможно. Я не программист, Я дизайнер. Так что у меня нет идей...

Herman&lt;T&gt;.Instance

MYSQL PIVOT - это поисковый запрос Google, который вам нужен.

1 Ответов

Рейтинг:
0

me7me7_1979

Используйте исходный запрос как вложенный подзапрос (то есть заключите его в две скобки) с любым псевдонимом, а затем сгруппируйте по нужному полю. Так и должно быть:

SELECT * FROM (YOUR_FULL_QUERY_SHOUD_BE_HERE) AS t
GROUP BY t.session_id

для условного значения ответа вы должны выбрать условие CASE, подобное этому:
CASE WHEN has_answer > 0 THEN `spss_name` ELSE
`option` END AS spss_name_option


* Вы должны позаботиться о негруппированных полях, потому что в MySQL вы можете потерять информацию, если попытаетесь выбрать негруппированные поля без какой-либо функции агрегации (она просто вернет любое единственное значение поля, если вы не укажете, что является вашим желаемым агрегированным значением, таким как MAX, MIN, SUM, COUNT и т. д.). Вы можете использовать очень полезную функцию в MySQL: GROUP_CONCAT с отдельной опцией для полей, в которых вам могут понадобиться все его многочисленные данные

например:
CAST(GROUP_CONCAT(/*DISTINCT*/`question_id`) AS CHAR) AS `question_id`