mysql - 动态数据透视表列mysql
问题描述
我有以下表格
人口统计类别
demographic_id demographic_name
1 color
2 age_group
项目测试
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;
解决方案
您的动态 SQL 很好,除了一件事。它在您的第二个左连接上有一个模棱两可的列project_id
,只需用pt.project_id
or替换它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;
我在rextester上运行它。这是链接:dynamic_pivot_test
推荐阅读
- python - 将 XX-HH:MM:SS 转换为 timedelta
- javascript - 捕获最后一个 Promise 在递归 Promise 中解决的时间
- java - 使用 getProperty 将 java 变量中的值分配给 jsp 变量
- python - seaborn 将我所有的变量标签保持在 X 刻度上
- powershell - 如何按字母顺序对页面进行排序
- php - 使用 Mysql 的错误日志持续时间
- amazon-web-services - AWS IoT 规则:获取控制数据包类型
- tensorflow - 如何保存和恢复 Keras LSTM 模型?
- php - Laravel 关系问题
- python - 大文件中每个人的唯一值总数