在MySQL中透视数据。

时间:2012-06-01 18:58:00

标签: mysql

我确信此类问题已经提出,但我一直在搜索,找不到与我需要的相似的东西。

编辑:所以经过一些阅读后,这看起来像是在枢轴下并使用群组连接。如果有人有任何见解ID真的很感激。

我有3个表(为简单起见,不必要的字段和数据被删除):

Students
id       name
------------------
1        John
2        Jane



Tests
id     name
------------------
1      Test1
2      Test2



Results
id    test_id     student_id   result
--------------------------------------
1     1           1            90
2     1           2            70
3     2           1            50
4     2           2            95

我想要的是能够制作这样的表格:

Name     Average    Test1    Test2
-----------------------------------
John     70         90        50
Jane     92.5       70        95

我知道如何获得平均值,我确信我可以通过一组丑陋的循环和php逻辑来完成这项工作,但我想获得最有效的解决方案。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

SELECT
    s.name,
    avg(r.result) AS average,
    t1.result AS test1,
    t2.result AS test2
FROM
    students s,
    results r,
    results t1,
    results t2
WHERE
    r.student_id = s.id AND
    t1.test_id = 1 AND
    t1.student_id = s.id AND
    t2.test_id = 2 AND
    t2.student_id = s.id
GROUP BY s.id;

+------+---------+-------+-------+
| name | average | test1 | test2 |
+------+---------+-------+-------+
| John |      70 |    90 |    50 | 
| Jane |    82.5 |    70 |    95 | 
+------+---------+-------+-------+

编辑:您无法根据测试表的内容动态生成测试列。您可以选择要用作列的特定值。

答案 1 :(得分:0)

您需要查看AVG功能。

答案 2 :(得分:0)

试试这个:

mysql> Select s.Name as Name, avg(r.result) as Average 
from result as r join Student as s 
on r.id=s.id group by (r.id)
你会得到类似的东西:

Name     Average 
-----------------
John     70    
Jane     92.5  

你不能把一行作为一列,假设John有100000倍的test1,就不可能将它作为列。