Столбцы динамической сводной таблицы mysql - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующие таблицы

demographic_categories

demographic_id  demographic_name
1               color
2               age_group

project_tests

test_id  group_id  project_id
1        1         1
2        1         1

test_demographic_requirements

test_id  project_id  demgraphic_id  demographic_value
1        1           1              blue
1        1           2              young
2        1           1              green
2        1           2              middle

И мне нужен запрос, который бы дал мне следующий результат:

test_id  group_id  color  age_group 
1        1         blue   young
2        1         green  middle

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

Я пытался сделать следующее, основываясь на предыдущих похожих вопросах, но это не такКажется, это работает для меня, вот что я попробовал:

SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when dc.demographic_name = ''',
          demographic_name,
          ''' then trd.demographic_value end) AS ',
          replace(demographic_name, ' ', '')
        )
      ) INTO @sql
    from demographic_categories;

    SET @sql = CONCAT('SELECT pt.test_id, pt.group_id,
    ', @sql,'
    from test_requirement_demographic trd
    LEFT JOIN demographic_categories dc ON trd.demographic_id = dc.demographic_id
    LEFT JOIN project_tests pt ON pt.test_id = trd.test_id and project_id =1
    group by pt.test_id;');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;

    DEALLOCATE PREPARE stmt;

1 Ответ

0 голосов
/ 30 мая 2018

Ваш динамический SQL просто отлично, за исключением одной вещи.На вашем втором левом соединении есть двусмысленный столбец project_id, просто замените его на pt.project_id или trd.project_id, и он даст желаемый результат.

SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when dc.demographic_name = ''',
          demographic_name,
          ''' then trd.demographic_value end) AS ',
          replace(demographic_name, ' ', '')
        )
      ) INTO @sql
    from demographic_categories;

SET @sql = CONCAT('SELECT pt.test_id, pt.group_id,
', @sql,'
from test_demographic_requirements trd
LEFT JOIN demographic_categories dc ON trd.demographic_id = dc.demographic_id
LEFT JOIN project_tests pt ON pt.test_id = trd.test_id and pt.project_id =1
group by pt.test_id;');

PREPARE stmt FROM @sql;
EXECUTE stmt;

DEALLOCATE PREPARE stmt;

Я запустил его на тестере.Вот ссылка: dynamic_pivot_test

...