SQL中的视频游戏Win%

时间:2017-04-27 20:32:14

标签: sql-server

试图自学SQL我已经开始在电子表格中记录我的视频游戏(特别是Overwatch)的结果,并且一直在玩SQL Server 2012并记录数据。

现在我有一个名为GamesPlayed的表,我正在尝试创建一个查询,我返回地图名称,胜利,损失和赢得%。

游戏桌看起来像;

CREATE TABLE [dbo].[GamesPlayed](
    [GameID] [int] IDENTITY(1,1) NOT NULL,
    [MapName] [varchar](25) NOT NULL,
    [FirstHero] [varchar](20) NOT NULL,
    [SecondHero] [varchar](20) NOT NULL,
    [Result] [varchar](20) NOT NULL,
    [SRChange] [int] NOT NULL,
    [TeamScore] [int] NOT NULL,
    [OppScore] [int] NOT NULL;

我正在尝试的查询是;

SELECT MapName as Map,
    Count(*) as 'Games Played',
    sum(case when Result = 'Win' then 1 else 0 end) Wins,
    sum(case when Result = 'Loss' then 1 else 0 end) Losses,
    Sum(case when Result = 'Win' then 1 else 0 end)/Count(*)*100.00 'Win%'
FROM GamesPlayed
group by MapName

我得到的问题是Win%列只是为每行返回0.00。我认为它与结果列数据类型有关。我不确定我是否需要结果列,看看如何从2个得分列(TeamScore和OppScore)中获得赢/输/抽奖结果。

任何有助于此工作的帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

Sean Lange在对这个问题的评论中提供了很好的解释。简单地说,你正在对整数进行除法,并且只会得到一个整数作为回报。您需要在要分割的其中一个数字上更改数据类型。

CREATE TABLE #GamesPlayed(
    [GameID] [int] IDENTITY(1,1) NOT NULL,
    [MapName] [varchar](25) NOT NULL,
    [FirstHero] [varchar](20) NOT NULL,
    [SecondHero] [varchar](20) NOT NULL,
    [Result] [varchar](20) NOT NULL,
    [SRChange] [int] NOT NULL,
    [TeamScore] [int] NOT NULL,
    [OppScore] [int] NOT NULL
);

INSERT INTO #GamesPlayed VALUES
('Map1', 'HeroA', 'HeroB', 'Win', 0, 0, 0),
('Map1', 'HeroA', 'HeroB', 'Loss', 0, 0, 0),
('Map2', 'HeroA', 'HeroB', 'Win', 0, 0, 0),
('Map2', 'HeroA', 'HeroB', 'Win', 0, 0, 0),
('Map3', 'HeroA', 'HeroB', 'Loss', 0, 0, 0)

SELECT
    MapName AS 'Map',
    SUM(1) AS 'Games Played',
    SUM(IIF(Result = 'Win', 1, 0)) AS 'Wins',
    SUM(IIF(Result = 'Loss', 1, 0)) AS 'Losses',
    SUM(IIF(Result = 'Win', 1.0, 0)) / SUM(1) * 100 AS 'Win%'
FROM
    #GamesPlayed
GROUP BY
    MapName

DROP TABLE #GamesPlayed

答案 1 :(得分:0)

您的查询是计算百分比的整数。您可以选择将赢取作为浮点数转换为浮点数,或者您可以在除数之前乘以100。试试这个。

SELECT MapName as Map,
    Count(*) as 'Games Played',
    sum(case when Result = 'Win' then 1 else 0 end) Wins,
    sum(case when Result = 'Loss' then 1 else 0 end) Losses,
    Sum((case when Result = 'Win' then 1 else 0 end)*100)/Count(*) 'Win%'
FROM GamesPlayed
group by MapName

编辑:因为这仍然是用整数计算的,所以这将向下舍入。要获得百分比的小数精度,请使用浮点数。