Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态透视表列mysql_Mysql_Pivot Table - Fatal编程技术网

动态透视表列mysql

动态透视表列mysql,mysql,pivot-table,Mysql,Pivot Table,我有以下几张表 人口统计类别 demographic_id demographic_name 1 color 2 age_group test_id group_id project_id 1 1 1 2 1 1 test_id project_id demgraphic_id demographic_value 1 1 1

我有以下几张表

人口统计类别

demographic_id  demographic_name
1               color
2               age_group
test_id  group_id  project_id
1        1         1
2        1         1
test_id  project_id  demgraphic_id  demographic_value
1        1           1              blue
1        1           2              young
2        1           1              green
2        1           2              middle
项目测试

demographic_id  demographic_name
1               color
2               age_group
test_id  group_id  project_id
1        1         1
2        1         1
test_id  project_id  demgraphic_id  demographic_value
1        1           1              blue
1        1           2              young
2        1           1              green
2        1           2              middle
测试人口统计要求

demographic_id  demographic_name
1               color
2               age_group
test_id  group_id  project_id
1        1         1
2        1         1
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;

您的动态SQL很好,除了一件事。它在您的第二个左联接上有一个不明确的列
project\u id
,只需将其替换为
pt.project\u id
trd.project\u 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;

我在雷克斯测试仪上运行了它。以下是链接:

但为什么您如此决心在RDBMS中执行此操作?请参阅动态代码。我在我的工作台中尝试过,结果显示此错误:09:35:58 PREPARE stmt FROM@sql错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,了解您在问题中发布的第1行0.000 secIs查询中使用的接近“NULL”的正确语法是否成功运行?