1

SQLのパーセンテージに問題があり、クエリを正しくフェッチします。次の結果が得られます。

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

結果は各グループのプレーヤー数であるため、2つのテーブルplayersとplayers_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;

ですから、私が望んでいるのは、各グループのプレーヤー数のパーセンテージを設定することです。おそらく、3つ以上のグループを作成する予定です...

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

これは使用できますが、パフォーマンスの問題が発生する可能性があります。

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 に答える
0

RDBMSを指定していませんが、分析関数をサポートする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

NbこれはSQL-Server用に書かれていますが、機能をサポートする他のDBMSに適応するためにわずかな調整が必要です。

編集

これは、1つのクエリ(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 に答える