-2

SQL查询忘记了,因为很久没用了。

我有以下要求。有一个名为 match 的表格,我可以在其中保存我的竞争对手的详细信息,了解我的团队与他们进行的比赛。所以一些重要的领域是这样的

match_id
competior_id
match_winner_id
ismatchtied
goals_scored_my_team
goals_scored_comp

从这张表中,我想获得所有竞争对手的头对头信息。像这样

Competitor Matches Wins Losses Draws 
A          10      5    4      1
B          8       3    2      1

我可以从 ismatchtied 获得的绘制信息设置为“Y”或“N”。我想从一个查询中获取所有信息。我可以从单独执行查询中获取所有信息,并在我的服务器代码中进行复杂的逻辑处理。但是我的表现会受到打击。

任何帮助将不胜感激。

干杯,索拉夫

4

2 回答 2

0

选择 m4.competior_id, COUNT(*) 作为 TotalMathces,

(从 m1 中选择 count(*),match其中goals_scored_my_team>goals_scored_comp AND m1.competior_id=m4.competior_id)作为 WINS,

(从 m2 中选择 count(*) 作为 WIN,match其中goals_scored_comp>goals_scored_my_team AND m2.competior_id=m4.competior_id)作为 LOSES,

(从 m3 中选择 count(*) 作为 WIN matchwheregoals_scored_my_team=goals_scored_comp AND m3.competior_id=m4.competior_id)作为 DRAWS

FROM matchm4 group by m4.competior_id;

于 2012-11-07T17:34:27.227 回答
0

您可以使用条件聚合,包括聚合函数中的 CASE 表达式,如下所示:

SELECT
  competitor_id,
  COUNT(*) AS Matches,
  COUNT(CASE WHEN goals_scored_my_team > goals_scored_comp THEN 1 END) AS Wins,
  COUNT(CASE WHEN goals_scored_my_team < goals_scored_comp THEN 1 END) AS Losses,
  COUNT(CASE WHEN goals_scored_my_team = goals_scored_comp THEN 1 END) AS Draws
FROM matches
GROUP BY
  competitor_id
;

当条件不满足时,上面的每个 CASE 都将评估为 NULL。并且由于省略了 NULL,因此上述查询中的 each 将有效地仅计算与相应 WHEN 条件匹配的行。COUNT(expr)COUNT(CASE ...)

So, the first COUNT counts only rows where my team scored more against the competitor, i.e. where my team won. In a similar way, the second and the third CASEs get the numbers of losses and draws.

于 2012-11-07T20:59:04.947 回答