一个表上的复杂SQL查询

时间:2012-11-07 16:45:31

标签: sql

忘记了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' 我想从一个查询中获取所有信息。我可以从单独执行查询中获取所有信息,并在我的服务器代码中执行复杂的逻辑处理。但我的表现会受到打击。

非常感谢任何帮助。

欢呼声, Saurav

2 个答案:

答案 0 :(得分:0)

SELECT m4.competior_id,COUNT(*)为TotalMathces,

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

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

(从match m3选择count(*)作为WIN,其中goals_scored_my_team = goals_scored_comp和m3.competior_id = m4.competior_id)为DRAWS

FROM match m4 group by m4.competior_id;

答案 1 :(得分: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。由于COUNT(expr)省略了NULL,因此上述查询中的每个COUNT(CASE ...)实际上只会计算与相应WHEN条件匹配的行。

所以,第一个COUNT只计算我的球队在对阵比赛中得分更高的行数,即我队赢得的比赛。以类似的方式,第二个和第三个CASE获得损失和抽取的数量。