我有一张像下面那样的表:
+------+------+------+-------+
| pkey | name | exam | score |
+------+------+------+-------+
| 1 | Bob | Math| 75 |
| 2 | Bob | Eng | 77 |
| 3 | Bob | Phy | 78 |
| 4 | Sue | Math| 80 |
| 5 | Sue | Eng | 90 |
| 6 | Sue | Phy | 97 |
| 7 | Suzy | Math| 98 |
| 8 | Suzy | Eng | 99 |
| 9 | Suzy | Phy | 99 |
+------+------+------+-------+
我想进行查询以将其转换为:
+------+------+------+-------+
| Name | Math | Phy | Eng |
+------+------+------+-------+
| Bob | 75 | 78 | 77 |
| Sue | 80 | 97 | 90 |
| Suzy| 90 | 99 | 99 |
+------+------+------+-------+
问题是,考试的纪律可能有500个不同的值,我无法定义它们,因为它们最终可能会改变,而是开始有600个不同的值。
是否可以创建一个读取检查值并创建新列以显示其值的查询?
例如,他们将历史记录添加到检查值,并说Suzy得到100,那就是这样:
+------+------+------+-------+-----+
| Name | Math | Phy | Eng | Hist|
+------+------+------+-------+-----+
| Bob | 75 | 78 | 77 | |
| Sue | 80 | 97 | 90 | |
| Suzy| 90 | 99 | 99 | 100 |
+------+------+------+-------+-----+
提前致谢
答案 0 :(得分:1)
SQL查询必须具有明确定义的列集。您可以使用prepare
语句和动态SQL执行所需操作。
另一种方法是创建一个可能值的字符串,例如Math:75, Phy78, Eng:77
。如果这适合你:
select name, group_concat(exam, ':', score separator ', ')
from table t
group by name;