2

这是我想要完成的简化版本。假设我有一个人表和一个测试表。每个测试都有 2 个与之相关的分数,每个人可以有 0,1 或多个测试


- PersonId(PK)
- PersonName

测试
- testId (PK)
- PersonId (FK)
- test1Score
- test2Score

我试图得到一个结果集,它给我一个排序的人员列表和平均 testScores。这就是我正在做的

SELECT GROUP_CONCAT( CASE  
    WHEN( tests.test1Score > 0 )   
    THEN( ( tests.test1Score + tests.test2Score)/2 )  
    ELSE( 99999999 ) END) as averageScore, person.PersonName  
FROM person  
JOIN tests  
    ON person.personId = tests.personId   
GROUP BY person.personId   
ORDER BY averageScore

发生的事情是 group_concat 返回一个字符串并按我的顺序执行结果是这样的

人名1 | 5,6
人名2 | 51,60
人姓名3 | 6、60

我知道我必须先按单个计算字段排序,然后按 group_concatenated 值排序,但不知道该怎么做。

任何帮助,将不胜感激

4

1 回答 1

0

您可以使用聚合子查询来执行此操作,并在您喜欢的任何字段上进行分组,而不是在连接的字符串上。使用您的字段的示例:

SELECT person.personID, person.personName, p.AvgOftest1score, p.AvgOftest2score
FROM person
INNER JOIN
(
SELECT personID, Avg(test1score) AS AvgOftest1score, Avg(test2score) AS AvgOftest2score
FROM tests
GROUP BY personID
) p
ON person.personID = p.personID
ORDER BY p.AvgOftest1score, p.AvgOftest2score;
于 2012-12-09T05:34:10.810 回答