4

履歴テーブルからデータを取得するための SQL クエリの作成を手伝ってもらえますか?

私はコーディング経験が 1 週間しかない初心者です。これまで単純な SELECT ステートメントを試してきましたが、つまずきにぶつかりました。

私のフットボール クラブのデータベースには 3 つのテーブルがあります。最初のものは、ボールをプレーヤーにリンクします。

BallDetail

| BallID | PlayerID | TeamID |
|-------------------|--------|
|      1 |       11 |     21 |
|      2 |       12 |     22 |

2 つ目は、ボールに起こることを示しています。

BallEventHistory

| BallID | Event |  EventDate |
|--------|------ |------------|
|      1 |  Pass | 2012-01-01 |
|      1 | Shoot | 2012-02-01 |
|      1 |  Miss | 2012-03-01 |
|      2 |  Pass | 2012-01-01 |
|      2 | Shoot | 2012-02-01 |

3 つ目は履歴変更表です。ボールの持ち主が変わった後、履歴が記録されます。

HistoryChanges

| BallID | ColumnName | ValueOld | ValueNew |
|--------|------------|----------|----------|
|      2 |   PlayerID |       11 |       12 |
|      2 |     TeamID |       21 |       22 |

ボールが他のプレーヤーに渡される前に、プレーヤー 11 がすべてのボールに対して行ったすべてのパスとシュートをリストする表を取得しようとしています。このような:

| PlayerID | BallID | Event | Month |
|----------|--------|-------|-------|
|       11 |      1 |  Pass |   Jan |
|       11 |      1 | Shoot |   Feb |
|       11 |      2 |  Pass |   Jan |

私はそう始めます:

SELECT PlayerID, BallID, Event, DateName(month, EventDate)
FROM BallDetail bd INNER JOIN BallEventHistory beh ON bd.BallID = beh.BallID
WHERE PlayerID = 11 AND Event IN (Pass, Shoot) ...

しかし、現在別のプレイヤーと一緒にいるにもかかわらず、ボール 2 も確実に含まれるようにするにはどうすればよいでしょうか?

4

2 に答える 2

1
Select PlayerID,BallID,Event,datename(month,EventDate) as Month,Count(*) as cnt from
(
Select 
Coalesce(
(Select ValueNew from #HistoryChanges where ChangeDate=(Select max(ChangeDate) from #HistoryChanges h2 where h2.BallID=h.BallID and ColumnName='PlayerID' and ChangeDate<=EventDate) and  BallID=h.BallID and ColumnName='PlayerID')
,(Select PlayerID from #BallDetail where BallID=h.BallID)
) as PlayerID,
h.BallID,h.Event,EventDate
from #BallEventHistory h
) a
Group by PlayerID, BallID, Event,datename(month,EventDate)
于 2012-11-08T20:19:41.640 に答える
1
SELECT d.PlayerID, d.BallID, h.Event, DATENAME(mm, h.EventDate) AS Month
FROM BallDetail d JOIN BallEventHistory h ON d.BallID = h.BallID 
WHERE h.Event IN ('Pass', 'Shoot') AND d.PlayerID = 11
  OR EXISTS (SELECT 1
             FROM dbo.HistoryChanges c
             WHERE c.ValueOld = 11 AND c.ValueNew = d.PlayerID AND c.ColumnName = 'PlayerID' and c.ChangeDate = h.EventDate)
于 2012-11-09T15:18:50.953 に答える