如何使用 group by 查询计算 sql 中的百分比?

How to calculate percentages in tsql using a group by query?

我有一个 table 按运动和开始和结束日期列出结果以及 win/loss 结果。我需要计算每项运动的获胜百分比 season_start。这是我的 table:

table1
******
id    sport  won   playerid     season_start  season_end    updated_date
---   -----  ----  --------     ------------ ------------  ------------
1     rugby   Y    kato23       2016-01-01     2016-01-31   2016-02-01
2     rugby   Y    king54       2016-01-01     2016-01-31   2016-02-01
3     rugby   N    robby1       2016-03-01     2016-03-28   2016-04-01
4     rugby   Y    kelly2       2016-03-01     2016-03-28   2016-04-01
5     soccer  Y    kato23       2016-01-01     2016-01-31   2016-02-01
6     soccer  Y    jeri44       2016-01-01     2016-01-31   2016-02-01
7     soccer  N    matt24       2016-06-01     2016-06-30   2016-07-01
8     tennis  Y    kray43       2016-01-01     2016-01-31   2016-02-01
9     tennis  Y    jeri44       2016-01-01     2016-01-31   2016-02-01
10    tennis  N    jeri44       2016-01-01     2016-01-31   2016-02-01

所以我想 运行 产生以下结果的查询:

sport     season_start     success_percent
-----     ------------     ---------------
rugby     2016-01-01        100.00
rugby     2016-03-01        50.00
soccer    2016-01-01        100.00
soccer    2016-06-01        0.00
tennis    2016-01-01        66.66

我试过了:

select sport,won, season_start, count(sport) as sportcount
from table1 where won = 'Y'
group by sport, won, season_start

但这只是给我全部计数,而不是实际的成功百分比。我尝试使用 case 语句,但我不太擅长使用 tsql,也不太擅长使用 'Sum' 来计算输赢,然后计算总赢的百分比。

有人可以提供执行此操作的 tsql 查询吗?

您可以为此使用条件计数:

select sport, season_start,
       sportcount = count(case when won = 'Y' then 'X' end) * 100.0 / count(*)
  from table1
 group by sport, season_start

请尝试以下查询:

SELECT sport, season_start,
       (CAST(COUNT(CASE won WHEN 'Y' THEN '1' ELSE NULL END) AS DECIMAL(10,2))) / CAST(COUNT(*) AS DECIMAL(10,2)))*100 AS sportcount
 FROM table1
 GROUP BY sport, season_start

事实上,在 COUNT 聚合函数中,我们检查 won 列的值,如果它等于 'Y',我们将计算它,否则我们将忽略它。您可能知道 Count 聚合函数会忽略 NULL 值,因此在 Count if won is not equal to 'Y' 中我们会生成一个 NULL 值,这将使 Count 忽略它。在我们计算获胜次数后,我们只需要将它除以每个运动和赛季的总比赛次数(Count(*) 会计算这个)。

你把won放在了group by里,那会出问题。每个具有相同组的记录将只在结果集中显示一次。如果您需要在 select 列表中获胜,您可以尝试 CROSS APPLY 或 Window 聚合函数。如果您需要,请更新您的问题,然后我会根据它更新我的答案。

请注意,如果您需要精确的结果,您可能需要将百分比计算部分转换或转换为小数或数字等数据类型。(这就是为什么我将两个计数转换为 DECIMAL 的原因)