4

こことそこに少し見つけましたが、私が持っている質問を実際にカバーするものは何もないので、ここに行きます. Amazon に本を注文しましたが、あと 1 週間は届かないので、できるだけ早く注文する必要があります。

基本的に以下を含む2つのテーブルがあります。

Table AユーザーID番号、ログイン名、勝ち、負け、引き分けを持っています

Table 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 日間の合計勝利数」フィールドはどちらのテーブルにも存在しないことに注意してください。)

4

1 に答える 1

1

次のようなスキーマとサンプル データを想定します。

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 日間で最も多くの勝利を収めた 10 人の名前と勝利データを返すことができます。

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 テーブルのデータを、最近の勝利数を計算し、上位 10 件の結果を取得する events テーブルのデータに対するサブクエリと結合することによって機能します。過去 7 日間に勝利したユーザーの場合、サブクエリは、その期間中に終了したイベントでユーザーが獲得した勝利数のカウントを返します。

注:期間中に勝利を収めていないユーザーは、どちらのクエリでも返されないため、結果が 10 件未満になる場合があります。

上記の SQL 作成スクリプトとクエリを使用した SQL Fiddle は、http: //sqlfiddle.com/#!3/0ebc8/2 にあります。

于 2013-02-03T04:39:15.797 に答える