1

我有一个关于 SQL 百分比的问题,我正确地获取了一个查询,我得到了这个结果:

 +----------+-------+---------+------+----+
 | nb_play  | group |         | percentage|
 +----------+-------+---------+------+----+
 | 55541    | group1          |           |
 | 02550    | group2          |           |
 | 12233    | group3          |           |
 +----------+-------+---------+------+-----

结果是每个组的玩家数量,所以我有两个表 player 和 player_group ,我的查询是:

Select 
count(p.Id) as nb_play ,
pg.group
from players p 
inner join players_group pg on p.Id=pg.player_id

group by pg.group

order by pg.group;

所以我希望每组有一定比例的玩家人数,也许我会拥有三个以上的组......

4

3 回答 3

1

尝试首先在变量中获取整体 COUNT:

DECLARE @totalCount AS INT
SET @totalCount = (SELECT COUNT(p.Id) from players p 
                   inner join players_group pg on p.Id=pg.player_id)

Select count(p.Id)/@totalCount * 100 as nb_play ,pg.group
 from players p 
 inner join players_group pg on p.Id=pg.player_id

 group by pg.group

 order by pg.group;
于 2012-10-23T12:11:34.950 回答
0

您尚未指定 RDBMS,但假设您有一个支持分析功能的 RDBMS,您可以利用这些功能(这几乎正是它们的用途):

WITH PlayerCount AS
(   SELECT  [nb_play] = COUNT(p.ID),
            pg.[Group]
    FROM    Players p
            INNER JOIN Players_Group pg
                ON pg.Player_ID = p.ID
    GROUP BY pg.[Group]
)
SELECT  [nb_play], 
        [Group],
        [Percentage] = CAST(100.0 * [nb_Play] / SUM([nb_play]) OVER() AS DECIMAL(5, 2))
FROM    PlayerCount

注意,这是为 SQL-Server 编写的,但只需稍作调整即可适应支持这些功能的其他 DBMS

编辑

这可以在一个查询中实现(没有 CTE 或子查询),但我不确定它会更有效:

SELECT  DISTINCT
        [nb_play] = COUNT(p.ID) OVER(PARTITION BY pg.[Group]),
        pg.[Group],
        [Percentage] = 100.0 * COUNT(p.ID) OVER(PARTITION BY pg.[Group]) / COUNT(p.ID) OVER()
FROM    Players p
        INNER JOIN Players_Group pg
            ON pg.Player_ID = p.ID
于 2012-10-23T12:20:28.523 回答
0

这可以使用,但您可能会遇到性能问题。

Select 
count(p.Id) as nb_play ,
pg.group,
(count(p.Id) / (select count(1) from players) ) * 100 as percentage
from players p 
inner join players_group pg on p.Id=pg.player_id
group by pg.group
order by pg.group;
于 2012-10-23T12:11:19.723 回答