Sql server SQL中的视频游戏赢%

Sql server SQL中的视频游戏赢%,sql-server,Sql Server,为了自学SQL,我开始在电子表格中记录视频游戏(特别是Overwatch)的结果,并使用SQL Server 2012播放记录的数据 现在我有一个名为GamesPlayed的表,我正在尝试创建一个查询,在其中我返回地图名、赢、输和赢% 玩的游戏桌看起来像 CREATE TABLE [dbo].[GamesPlayed]( [GameID] [int] IDENTITY(1,1) NOT NULL, [MapName] [varchar](25) NOT NULL, [Fi

为了自学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。我认为这与结果列数据类型有关。我根本不确定是否需要结果栏,也不知道如何从两个得分栏(TeamScore和OppScore)中得出赢/输/平局结果


任何有助于实现这一目标的方法都会很好。

肖恩·兰格(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

您的查询正在计算百分比的整数。你的选择是将赢款作为一个浮点数,它将提供浮点数的百分比,或者你可以在除法之前乘以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

编辑:由于仍在使用整数计算,因此将向下取整。要获得百分比中的小数精度,请使用浮点。

您可以添加一些数据或创建sql FIDLE吗?如果您将Win%中的
1
0
更改为
1.0
0.0
,这会有区别吗?Zim I无意中标记了您的注释,而不是向上投票。我的错!您可以将此操作简化一点,将“Result”列更改为“PlayerWon”,并将其改为一点或甚至一个tinyint,而不是varchar。更改为1.0之所以有效,是因为整数数学。它将首先进行除法,这将是一个int/int,所以你得到一个int结果,然后它乘以100.00,所以你将始终有两个小数位。将数据类型强制为带1.0的数字意味着除法将以小数为单位,这样您就可以得到正确的结果。
SUM(1)
应该是
SUM(*)
谢谢,我更喜欢这个,而不是使用CASE,删除结果列并从TeamScore和OppScore列中计算赢家/输家/平局会更好吗?@mallan1121您不能
SUM(*)
。你是说,
COUNT(*)
?@Nate我得给你一个经典的答案“这取决于”这个答案。如果你想要更多的解释,让我知道,我们可以在聊天中继续对话。Durr,是的,我知道了。没有借口!但是你没有投下任何东西。。。你也没有让它成为浮点数。不,我在除法之前乘以100。假设你赢了10场比赛中的5场,那么5/10=.5(SQL将其舍入为0)乘以100=0。等于5*100=500/10=50。这避免了小数,但如果有小数,它将四舍五入为一个整数。