繁体   English   中英

动态数据透视表MySql

[英]Dynamic Pivot Table MySql

我在数据库中有一个表,记录着学生的成绩,如下所示:

| id     | criteriaid   |  mark     | studentid     |
| 1      | 5            |  62       | 5             |
| 2      | 6            |  54       | 5             |
| 3      | 7            |  48       | 5             |

然后将其链接到Criteria表,如下所示:

| id     | title        |
| 5      | Presentation |
| 6      | Communication|
| 7      | Research     |

像这样的学生桌:

| id     |firstname     | lastname       |
| 10     |Joe           | Bloggs         |

虽然将表连接在一起没有问题,但看起来可能像这样:

| id | firstname | lastname  |  criteria     | mark     |
| 10 | Joe       | Bloggs    |  Presentation | 62       |
| 10 | Joe       | Bloggs    |  Communication| 54       |
| 10 | Joe       | Bloggs    |  Research     | 48       |

我一直在试验数据透视表教程,但无法获得所需的结果..我认为这是一个动态数据透视表。 (条件必须是动态的)。 这就是我要的:

| id | firstname | lastname  |  Presentation | Communication | Research  |
| 10 | Joe       | Bloggs    |       62      |      54       |     48    |

目前,我正在尝试按此处建议的方式进行硬编码,这与mysql数据透视表有关

SELECT s.firstname, s.lastname, m.mark,
  max(case when c.title = 'Attitude' then m.mark end) attitude,
  max(case when c.title = 'Acting' then m.mark end) acting,
  max(case when c.title = 'Presentation' then m.mark end) presentation,
  max(case when c.title = 'Voice' then m.mark end) voice
from marks m
LEFT JOIN criteria c ON m.criteriaid = c.id
LEFT JOIN students s ON s.id = m.studentid

现在,它运行良好,但是我需要动态解决方案。 我将继续尝试-如果有人可以帮助,我们将不胜感激。

我现在到这里

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when c.title = ''',
          title,
          ''' then m.mark end) AS ',
          replace(title, ' ', '')
        )
      ) INTO @sql
    from criteria;

    SET @sql = CONCAT('SELECT s.firstname, s.lastname,
    ', @sql,'
    from marks m
    LEFT JOIN criteria c ON m.criteriaid = c.id
    LEFT JOIN students s ON s.id = m.studentid
    group by s.id;');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;

    DEALLOCATE PREPARE stmt;

这可能有效,但是在PHPMyAdmin中不起作用...寻找解决方案!

很难看到如何制作一个根据表中的数据而具有不同列的sql表,但是您可以获得所需的一些内容。

您可以使用以下查询:

SELECT studentid,
   MAX(CASE WHEN criteriaid=5 THEN mark END) AS Presentation,
   MAX(CASE WHEN criteriaid=6 THEN mark END) AS Communication,
   MAX(CASE WHEN criteriaid=7 THEN mark END) AS Research
FROM marks
GROUP BY studentid

那并不能回答您的问题-但是它可以用SQL而不是php来完成大部分工作。 您可能可以根据表中的条件在PHP中构造SQL语句。

这是有效的结果,但是在PHP中不起作用。 决定与PHP一起使用硬编码选项来构建SQL字符串。

SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when c.title = ''',
          title,
          ''' then m.mark end) AS ',
          replace(title, ' ', '')
        )
      ) INTO @sql
    from criteria;

    SET @sql = CONCAT('SELECT s.firstname, s.lastname,
    ', @sql,'
    from marks m
    LEFT JOIN criteria c ON m.criteriaid = c.id
    LEFT JOIN students s ON s.id = m.studentid
    group by s.id;');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;

    DEALLOCATE PREPARE stmt;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM