GROUP BY每行获得几个聚合

问题描述 投票:1回答:3

我有一张桌子游戏,其中我有玩家1,玩家2和赢家的ID

player_1   player_2   winner
1          2          1
1          2          1
1          3          3
2          3          2
2          1          2

我想进行一个查询,其中最终结果类似于:

players     num_games_played   wins  
1|2         3                  2|1
1|3         1                  0|1
2|3         1                  1|0

基本上我需要按结果分组,以显示所玩游戏的列表和每位玩家的获胜次数。

我不确定我是应该坚持使用这种表还是制作一些关系表。

有关最佳方法的建议吗?

sql sql-server
3个回答
1
投票

这是解决这个问题的一种方法。

if OBJECT_ID('tempdb..#Games') is not null
    drop table #Games

create table #Games
(   
    player1 int
    , player2 int
    , winner int
)

insert #Games values
(1, 2, 1)
, (1, 2, 1)
, (1, 3, 3)
, (2, 3, 2)
, (2, 1, 2)

select players = convert(varchar(5), player1) + '|' + convert(varchar(5), player2)
    , num_games_played = count(*)
    , convert(varchar(5), sum(case when winner = player1 then 1 else 0 end)) + '|' + convert(varchar(5), sum(case when winner = player2 then 1 else 0 end))
from
(
    select player1
        , player2
        , winner
    from #Games
    where player1 < player2

    union all

    select player2
        , player1
        , winner
    from #Games
    where player2 < player1
) x
group by convert(varchar(5), player1) + '|' + convert(varchar(5), player2)

0
投票

我会使用一些关系表,如果你以后进行一些允许来自两个以上玩家的更新,你将很容易得到结果并且也会帮助你。也许一个表格中包含游戏/匹配信息,另一个表格链接到游戏桌面,您可以在其中播放比赛的玩家以及结果的比特字段(赢家)。


0
投票

这是另一个使用上述SQL查询的类似想法的代码

with demo_solution as (
select 
p1=case when player1>player2 then player2 else player1 end,
p2=case when player1>player2 then player1 else player2 end,
winner
from Games
)
select 
players = cast(p1 as varchar)+'|'+cast(p2 as varchar),
num_games_played = count(1),
wins = cast(sum(case when winner=p1 then 1 else 0 end) as varchar)
     +'|'+
    cast(sum(case when winner=p2 then 1 else 0 end) as varchar)
from demo_solution
group by cast(p1 as varchar)+'|'+cast(p2 as varchar)
© www.soinside.com 2019 - 2024. All rights reserved.