如何使用查询按组计算tsql中的百分比?

时间:2016-06-01 20:38:12

标签: sql-server tsql group-by percentage

我有一张表格,按运动,开始和结束日期以及赢/输结果列出结果。我需要计算每赛季每项运动的胜率百分比。这是我的表:

UITapGestureRecognizer(target: self, action: #selector(onTap))

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

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

但这只是给我整个计数而不是实际的成功百分比。我尝试使用case语句,但我对tsql不太好,或使用' Sum'计算胜利和损失,然后计算总胜负百分比。

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

2 个答案:

答案 0 :(得分:1)

您可以使用条件计数:

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

答案 1 :(得分:1)

请尝试以下查询:

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不等于'Y',我们会生成一个NULL值,使Count忽略它。在我们统计赢得的数量后,我们只需要将其除以每项运动和赛季的总比赛数(计数(*)将计算在内)。

你把胜利放在了小组中,这会引起问题。具有相同组的每个记录将仅在结果集中显示一次。如果您需要在选择列表中获胜,可以尝试CROSS APPLY或Window Aggregate Functions。如果您需要,请更新您的问题,之后我会根据它更新我的答案。

请注意,如果您需要获得精确的结果,您可能需要将百分比计算部分CAST或CONVERT转换为十进制或数字或等数据类型。(这就是为什么我将两个计数转换为DECIMAL)< / p>