忘记了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
答案 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获得损失和抽取的数量。