如何使用 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 的原因)
我有一个 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 的原因)