【问题标题】:Dynamic Pivot table columns mysql动态数据透视表列mysql
【发布时间】:2018-05-30 04:03:01
【问题描述】:

我有以下表格

人口统计类别

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;

【问题讨论】:

标签: mysql pivot-table


【解决方案1】:

您的动态 SQL 很好,除了一件事。它在您的第二个左连接上有一个模棱两可的列project_id,只需将其替换为pt.project_idtrd.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

【讨论】:

  • 我在我的工作台上试过,它显示了这个错误:09:35:58 PREPARE stmt FROM @sql 错误代码:1064。你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行 0.000 秒的“NULL”附近使用正确的语法
  • 您在问题中发布的查询是否运行成功?
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多