目前,我有一张班主任的成绩表。我正在尝试将行作为列联接。从本质上讲,该结果应提供不同年份班长的性别概况。
名为results
的表:
+----+------+---------+--------+----------+-----------+-------+----------+-----------+
| id | year | faculty | winner | w_gender | w_percent | loser | l_gender | l_percent |
+----+------+---------+--------+----------+-----------+-------+----------+-----------+
| 1 | 2016 | Yellow | Tom | B | 56 | Jill | G | 46 |
| 2 | 2016 | Green | Susan | G | 52 | Sandy | G | 48 |
| 3 | 2016 | Purple | Carly | G | 51 | Jax | B | 49 |
| 4 | 2018 | Yellow | Tom | B | 56 | Jill | G | 46 |
| 5 | 2018 | Green | Ben | B | 52 | Sandy | G | 48 |
| 6 | 2018 | Purple | Amanda | G | 52 | James | B | 48 |
+----+------+---------+--------+----------+-----------+-------+----------+-----------+
预期结果:
+--------+------+------+
| group | 2016 | 2018 |
+--------+------+------+
| yellow | B | G |
| green | G | G |
| purple | G | B |
+--------+------+------+
有效 MySQL查询,已从MySQL Join Multiple Rows as Columns修改:
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;
我当前的MySQL查询太复杂,偶尔会触发MySQL超时。那么,如何简化这个MySQL查询?
更新:year
列应该是动态的,并且即使我在未来几年中添加更多结果,查询也应该可以正常工作。
答案 0 :(得分:1)
您可以使用以下查询获得按年份汇总的结果。
您需要为每种教职员工的颜色添加一个新列,但是鉴于这是一个已知的有限列表,应该不会有问题。
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
这是一个简化的工作数据库小提琴:https://www.db-fiddle.com/f/uoX44nDLSji344iXCdmtfV/0