动态透视表列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”的正确语法是否成功运行?