【问题标题】:SQL Query to create a report of matches played用于创建比赛报告的 SQL 查询
【发布时间】:2016-08-09 12:54:37
【问题描述】:

最近有人问我以下 SQL 查询问题?有人可以帮我解决这个问题。我有一个包含三列的表格 - 主队、客队和获胜者队。如下所示。

H_T  A_T  W_T
AUS  IND  IND
ENG  AUS  ENG
IND  AUS  AUS
AUS  ENG  AUS
ENG  IND  IND
IND  ENG  IND

以上数据需要在 SQL 中转换以显示具有以下属性的报表 球队名称、比赛总数、获胜次数、平局次数、失败次数、积分。

为了计算积分,这些是每种类型的公式(赢/平/输)

获胜 = 获胜次数 * 3

绘制 = 绘制次数 * 1

损失 = 损失计数 * 0

点将与以上三个值相加。

提前致谢

【问题讨论】:

  • 什么决定了平局?您使用的是哪个数据库?
  • 添加预期结果。并向我们​​展示您当前的查询尝试。
  • 您可以使用 group by 和 sum 等聚合函数来完成。另外,您使用的是哪个数据库提供商?

标签: sql


【解决方案1】:

需要更多关于定义draw 的信息,这假定w_t 列包含值draw 而不是团队。

无论哪种方式,您都可以使用conditional aggregation 来获得您想要的结果。通常你会有一个teams 表和join,但你可以使用union 和一个子查询来创建它:

select t.*, 
  (win_count * 3) + (draw_count) as Points
from (
  select t.team,
    count(*) Total_Matches_Played,
    count(case when t.team = y.w_t then 1 end) Win_Count,
    count(case when t.team <> y.w_t then 1 end) Loss_Count,
    count(case when y.w_t = 'DRAW' then 1 end) Draw_Count
  from (
    select h_t as team from yourtable
    union select a_t from yourtable
    ) t join yourtable y on t.team in (y.a_t,y.h_t)
  group by t.team
  ) t

【讨论】:

  • 请注意,ANSI SQL 在选择列表中需要t.* 而不是*。 (* 必须是一个人。)
猜你喜欢
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多