CASE语句解决方法在一组ID中设置值

时间:2017-07-19 09:41:09

标签: sql-server tsql

我在GamePlayers表中有以下数据:

GameId   PlayerId  BotId           
1        100       NULL
1        200       NULL
2        100       NULL
2        NULL      NULL
3        200       NULL
3        NULL      100

我想举报人/计算机/机器人游戏的百分比。计算机和机器人游戏分开处理。如果我把它放到CASE声明中,它就是一个简单的

CASE  WHEN PlayerId IS NOT NULL THEN 'Human'
      WHEN PlayerId IS NULL AND BotId IS NULL THEN 'Computer'
      WHEN PlayerId IS NULL AND BotId IS NOT NULL THEN 'Bot'
      END OpponentType

但当然我需要通过GameId对数据进行分组,以便删除重复的GameId。

计算机和机器人永远不能相互对抗。一个人类可以挑战一个人类,但如果他在30秒后没有得到回复,他将被提议与一个Bot对战。人类也可以选择单独与电脑对战。

我需要做的是将一个值设置为“人类' BOT'或者'计算机'然后在Power BI上报告它。如何对数据进行分组以确定人类对手是否与人类,机器人或计算机对战?

这是我预期的结果集:

GameId   GameType         
1        Human
2        Computer
3        Bot

2 个答案:

答案 0 :(得分:1)

我使用了您的查询,如下所示:

Select GameId, 
    case when max(OpponentType) = mIn(opponenttype) and Min(opponenttype) = 'Human' then 'Human' 
        when min(opponenttype) = 'Computer' then 'Computer'
        when min(opponenttype) = 'Bot' then 'Bot' else null end as OpponentType 
    from ( Select GameId , CASE  WHEN PlayerId IS NOT NULL THEN 'Human'
  WHEN PlayerId IS NULL AND BotId IS NULL THEN 'Computer'
  WHEN PlayerId IS NULL AND BotId IS NOT NULL THEN 'Bot'
  END OpponentType
  from #Game ) a
group by gameid

您不需要在子查询中执行opponenttype,而是可以在主查询本身中执行此操作

答案 1 :(得分:1)

您可以通过下面的查询

在组中使用案例
 select 
       gameId, 
       case 
          WHEN count(PlayerId)=2 THEN N'Human'
          WHEN count(BotId) =1 THEN N'Bot'
          WHEN count(BotId) =0 AND count(PlayerId)=1 THEN 'Computer'
          END as OpponentType
    from GamePlayers  group by GameId