MySQL数据库处理值

时间:2014-05-20 15:51:27

标签: mysql pivot

我有一张像下面那样的表:

+------+------+------+-------+
| 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 |
+------+------+------+-------+-----+

提前致谢

1 个答案:

答案 0 :(得分:1)

SQL查询必须具有明确定义的列集。您可以使用prepare语句和动态SQL执行所需操作。

另一种方法是创建一个可能值的字符串,例如Math:75, Phy78, Eng:77。如果这适合你:

select name, group_concat(exam, ':', score separator ', ')
from table t
group by name;