从分组中获取单个记录

4

我有两个表格,一个是带有类别标签的姓名表格,另一个是每个姓名对应的分数表格。

ID    Name      Category
1     Dave      1
2     John      1
3     Lisa      2
4     Jim       2

而得分表格为:

PersonID      Score
1             50
2             100
3             75
4             50
4             75

我希望有一个查询返回类似以下的内容:
Category    TotalScore    Names
1           150           Dave, John
2           200           Lisa, Jim

这个问题是否可以用一个查询来解决?

我可以通过对类别分组并使用求和查询来获取总数,但是无法看到以我想要的方式获取名称。

非常感谢。

3个回答

4
你需要使用group_concat函数:
select Category, sum(Score) as TotalScore, group_concat(Name) as Names from categories
join scores on scores.category = categories.category
group by category

甚至更好的是:
group_concat(DISTINCT Name ORDER BY Name ASC SEPARATOR ',') as names

我尝试在 SQL 语句的末尾添加了一个 order by,现在名称只返回“BLOB”。这是 SQL 语句,有什么想法为什么它现在失败了,即使我已经包括了 order by。谢谢。SELECT group_concat(DISTINCT tblnames.name,' ',tblnames.surname SEPARATOR ' and ') AS 'nameOfPair', Sum(tblpersonscores.score) AS 'totalScore' FROM tblnames Inner Join tblpersonscores ON tblpersonscores.personID = tblnames.id GROUP BY tblnames.category ORDER BY 'totalScore' ASC - Dave
虽然看起来不太美观,但如果你尝试一下这个查询语句:"select * from (SELECT group_concat(DISTINCT tblnames.name,' ',tblnames.surname SEPARATOR ' and ') AS 'nameOfPair', Sum(tblpersonscores.score) AS 'totalScore' FROM tblnames Inner Join tblpersonscores ON tblpersonscores.personID = tblnames.id GROUP BY tblnames.category) as a order by TotalScore ASC" 你会得到什么结果? - Lordalcol
这个确实可以工作,但我不是完全确定为什么!!你能解释一下吗? - Dave
我也不确定,但我猜它在分组之前对行进行排序。在这种情况下,group_concat返回BLOB。但是我要重申,我不确定这一点。 - Lordalcol
感谢您的回复,也感谢您解决了这个问题,非常感激! - Dave

1

这里是适用于Postgres的解决方案(它没有group_concat()函数):

select category, sum(score) as TotalScore, array(select id from perso where category=P.category order by id) as Names from perso P JOIN scores S ON S."PersonID" = P.id GROUP BY category;

我知道这是一个MySQL的问题,但是有人可能会在谷歌上搜索并需要Postgres的答案 :)


1
只需在您的求和查询中添加group_concat(Name) as names即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接