sql-server - SQL Server 存储过程返回表,每个用户的唯一性计数

标签 sql-server sql-server-2008 tsql stored-procedures

我在这里和那里找到了一点,但没有什么能真正涵盖我的问题,所以这里就走了。我已经从亚马逊订购了一本书,但它要再过一个星期才能到,我真的需要尽快这本书

我有两个表,基本上包含以下内容。

表 A 有用户 ID 号、登录名、获胜、失败、平局

B表有用户id号,游戏结束时,游戏状态

我想要的是创建一个存储过程,它将返回上周获胜的前 10 名。

Loginname | total wins, last 7 days | all wins | all losses | all ties
Name1     |         10              |   40     |     8      |      6
Name2     |          9              |   96     |    76      |      19

等....

我目前拥有的是:

SELECT A.login,
       A.draws_count,
       A.losses_count,
       A.wins_count
FROM   [TableB] AS B
       INNER JOIN
       [TableA] AS A
       ON B.won_by_id = A.id
WHERE  B.win_defined_time > (GETDATE() - 7)
       AND B.state = 'OVER';

从那里我不知道如何返回我需要的表。任何帮助将不胜感激。 (还要记住,两个表中都不存在“过去 7 天的总获胜次数”字段。)

最佳答案

假设一个模式和示例数据如下:

CREATE TABLE [dbo].[Competitors]
(
    [id]         INT          NOT NULL,
    [login_name] VARCHAR (50) NOT NULL,
    [wins]       INT          NOT NULL,
    [losses]     INT          NOT NULL,
    [ties]       INT          NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Events]
(
    [id]            INT          NOT NULL,
    [Competitorid]  VARCHAR (50) NOT NULL,
    [EventDateTime] DATETIME     NOT NULL,
    [winner]        BIT          NOT NULL,
    [EventStatus]   VARCHAR (50) NOT NULL
) ON [PRIMARY]

INSERT  INTO Competitors (id, login_name, wins, losses, ties)
VALUES                  (1, 'Player 1', 40, 8, 6),
                        (2, 'Player 2', 96, 76, 19),
                        (3, 'Player 3', 1, 0, 0)

INSERT  INTO Events (id, Competitorid, EventDateTime, winner, EventStatus)
VALUES             (1, 1, '2013-01-25 01:05:25.000', 1, 'OVER'),
                   (2, 1, '2013-01-26 01:05:25.000', 1, 'OVER'),
                   (3, 1, '2013-01-27 14:05:25.000', 1, 'OVER'),
                   (4, 1, '2013-01-28 01:05:25.000', 1, 'OVER'),
                   (5, 1, '2013-01-29 15:05:25.000', 1, 'OVER'),
                   (6, 1, '2013-01-30 01:05:25.000', 1, 'OVER'),
                   (7, 1, '2013-01-31 22:05:25.000', 1, 'OVER'),
                   (8, 1, '2013-02-01 01:05:25.000', 1, 'OVER'),
                   (9, 1, '2013-02-02 21:05:25.000', 1, 'OVER'),
                   (10, 1, '2013-01-02 11:05:25.000', 0, 'INPROGRESS'),
                   (11, 1, '2013-01-30 01:05:25.000', 1, 'OVER'),
                   (12, 2, '2013-01-25 11:05:25.000', 1, 'OVER'),
                   (13, 2, '2013-01-26 01:05:25.000', 1, 'OVER'),
                   (14, 2, '2013-01-27 11:25:25.000', 1, 'OVER'),
                   (15, 2, '2013-01-28 01:05:25.000', 1, 'OVER'),
                   (16, 2, '2013-01-29 11:45:25.000', 1, 'OVER'),
                   (17, 2, '2013-01-30 01:45:25.000', 1, 'OVER'),
                   (18, 2, '2013-01-31 12:15:25.000', 1, 'OVER'),
                   (19, 2, '2013-02-01 01:05:25.000', 1, 'OVER'),
                   (20, 2, '2013-02-02 22:25:25.000', 1, 'OVER'),
                   (21, 2, '2013-02-02 15:05:25.000', 0, 'INPROGRESS'),
                   (22, 2, '2013-01-25 01:05:25.000', 1, 'OVER'),
                   (23, 1, '2013-01-30 01:05:25.000', 0, 'OVER'),
                   (24, 2, '2013-01-30 01:05:25.000', 0, 'OVER'),
                   (25, 3, '2012-01-30 01:05:25.000', 1, 'OVER')

您可以使用以下查询返回过去 7 天内获胜次数最多的十个人的姓名和获胜数据:

SELECT TOP 10 login_name,
              recent_wins,
              wins AS 'All Wins',
              losses AS 'All losses',
              ties AS 'All Ties'
FROM   Competitors
       INNER JOIN
       (SELECT   COUNT(*) AS recent_wins,
                 Competitorid
        FROM     events
        WHERE    winner = 1
                 AND eventdatetime BETWEEN GetDate() - 7 AND GetDate()
                 AND EventStatus = 'OVER'
        GROUP BY Competitorid) AS recent_event_winners
                 ON Competitors.ID = recent_event_winners.Competitorid;
ORDER BY recent_wins DESC

此查询的工作原理是将 Competitors 表中的数据与 events 表中数据的子查询结合在一起,该子查询正在计算最近获胜的次数,然后获取前 10 个结果。对于在过去 7 天内获胜的用户,子查询返回用户在该时间段内结束的事件中获胜的次数。

注意:在该时间段内没有任何获胜的用户不会被任何查询返回,因此结果可能少于 10 个结果。

可以在 http://sqlfiddle.com/#!3/0ebc8/2 找到带有上述 sql 创建脚本和查询的 SQL Fiddle

关于sql-server - SQL Server 存储过程返回表,每个用户的唯一性计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668892/

相关文章:

sql - 为什么在 Microsoft SQL Server 中使用 "Y"/"N"而不是位字段?

sql - 如何使用聚合函数sql server选择列

插入触发器之前的 SQL Server 2008

sql-server - TSQL STATS_STREAM(未记录的功能)的格式是什么?它包含所有统计数据吗?

sql-server-2005 - 根据同一个表上的子查询更新表中的行

sql - 捕获前 5 行并组合其余的 SQL Server

sql - 我可以使用 Developer 版本的 SQL Server 复制组件吗?

sql - 加快临时表更新的性能

sql-server - 比较跨多个数据库的存储过程 (SQL Server)

sql-server-2008 - 如何使用表值参数插入多行然后返回它们的 ID?