Sql 根据给定陪审团的平均投票数对团队进行排序
我有以下模式:Sql 根据给定陪审团的平均投票数对团队进行排序,sql,postgresql,Sql,Postgresql,我有以下模式: teams(id, name) jury(id, name) criteria(id, name, coefficient, jury_id) vote(id, team_id, jury_id, value, criterion_id) 我想让每一个团队,并命令他们的平均投票给一个给定的陪审团 以下是我当前的SQL: SELECT teams.*, SUM(votes.value * criteria.coefficient) / SUM(criteria.coeffi
teams(id, name)
jury(id, name)
criteria(id, name, coefficient, jury_id)
vote(id, team_id, jury_id, value, criterion_id)
我想让每一个团队,并命令他们的平均投票给一个给定的陪审团
以下是我当前的SQL:
SELECT teams.*,
SUM(votes.value * criteria.coefficient) / SUM(criteria.coefficient) AS rating
FROM "teams"
LEFT JOIN "votes" ON "teams"."id" = "votes"."team_id"
LEFT JOIN "criteria" ON "votes"."criterion_id" = "criteria"."id"
WHERE (votes.jury_id = 3510 OR votes.jury_id IS NULL)
GROUP BY teams.id
ORDER BY rating DESC NULLS LAST, teams.id
这适用于以下情况:
- 代表团投票选出陪审团
- 团队投票选出陪审团和其他陪审团(不考虑其他陪审团的投票)
- 该团队完全没有投票权(该团队出现在列表的末尾)
- 该团队投票给另一个陪审团,但不在选定的陪审团中(在这种情况下,该团队不会出现在列表中)
我如何才能做到这一点。我最终得到了以下SQL:
SELECT "teams".*
FROM (
SELECT teams.*, SUM(votes.value * criteria.coefficient) / SUM(criteria.coefficient) AS rating, teams.id
FROM "teams"
LEFT JOIN "votes" ON "teams"."id" = "votes"."team_id"
LEFT JOIN "criteria" ON "votes"."criterion_id" = "criteria"."id"
WHERE (votes.jury_id = 3613 OR votes.jury_id IS NULL)
GROUP BY teams.id
UNION
SELECT teams.*, NULL AS rating, teams.id
FROM "teams"
INNER JOIN "votes" ON "votes"."team_id" = "teams"."id"
INNER JOIN "criteria" ON "criteria"."id" = "votes"."criterion_id"
GROUP BY teams.id HAVING EVERY(votes.jury_id != 3613)
) AS teams
ORDER BY rating DESC NULLS LAST, teams.created_at
但是,我无法对teams.id进行排序,因为它显示的列不明确。我尝试用另一个别名替换“AS teams”,但没有成功,因此我使用了在上创建的另一列 除了筛选表投票强制执行内部联接之外,您是否尝试将isnull(SUM(vows.value*criteria.covercient)/SUM(criteria.covercient),0添加为评级,以便更好地使用子查询。“团队被投票给另一个陪审团,但不是所选陪审团”,因为在您的子句中,您说如果juryId=3510或null…/请尝试删除该选项……问题是,由于where子句:
where(voates.jury\u id=3510或voates.jury\u id为NULL)
,没有选择任何投票给其他陪审团但没有投票给当前陪审团的团队。在这种情况下,不会有一个投票值为空的团队行,而是一个投票涉及另一个陪审团的团队行,因此它将通过WHERE子句进行过滤。您可以删除过滤器,并使用case when VOUTES计算给定陪审团的平均投票。陪审团id=3510,然后求和(…)否则0结束。然后,您可以添加联合查询,以获取所有其他缺少的评分为0的团队