如何将MySQL连接行简化为列?
目前,我有一个班级主席成绩表。我正在尝试将行作为列连接。基本上,结果应该提供不同年份班长性别的概述 表,命名结果: 预期结果:如何将MySQL连接行简化为列?,mysql,join,Mysql,Join,目前,我有一个班级主席成绩表。我正在尝试将行作为列连接。基本上,结果应该提供不同年份班长性别的概述 表,命名结果: 预期结果: +--------+------+------+ | group | 2016 | 2018 | +--------+------+------+ | yellow | B | G | | green | G | G | | purple | G | B | +--------+------+------+ 工作MySQL查询,
+--------+------+------+
| group | 2016 | 2018 |
+--------+------+------+
| yellow | B | G |
| green | G | G |
| purple | G | B |
+--------+------+------+
工作MySQL查询,修改自:
我当前的MySQL查询太复杂,偶尔会触发MySQL超时。那么,如何简化这个MySQL查询呢
更新:年份列应该是动态的,即使我在未来几年添加了更多结果,查询也应该可以工作。您可以使用以下查询按年份汇总结果 您需要为每种颜色添加一个新列,但考虑到这是一个已知的有限列表,这不应该是一个问题
SELECT
MAX(year) AS year,
MAX(IF(faculty = 'Yellow', w_gender, NULL)) AS yellow,
MAX(IF(faculty = 'Green', w_gender, NULL)) AS green,
MAX(IF(faculty = 'Purple', w_gender, NULL)) AS purple
FROM results
GROUP BY year
这里有一个简化的工作数据库FIDLE:可能是的副本这里没有太多的简化要做。要根据表的内容动态生成这些列(2016、2018),这种方法需要执行两条语句。注意组concat\u max\u len。为了提高性能,我会使第一个查询更复杂一些。。。而不是从结果来看,我会。。。从“按年度从结果组中选择年度”v rt gwt中,结果将缩减为年度的不同值,然后通过组集合运行该值。以年度为前导列的指数应该有助于按业绩分组。分组是否固定?如果是这样的话,那么创建“组”列和“年”行就容易多了。@spencer7593谢谢你的建议,我会试试看。
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN year = ', year, ' THEN w_gender END) AS ', CONCAT('`', year, '`')) ORDER BY year ASC) INTO @sql FROM results;
SET @sql = CONCAT('SELECT faculty, ', @sql, ' FROM results GROUP BY faculty');
PREPARE stmt FROM @sql;
EXECUTE stmt;
SELECT
MAX(year) AS year,
MAX(IF(faculty = 'Yellow', w_gender, NULL)) AS yellow,
MAX(IF(faculty = 'Green', w_gender, NULL)) AS green,
MAX(IF(faculty = 'Purple', w_gender, NULL)) AS purple
FROM results
GROUP BY year