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的团队