SQL Server: как мне получить данные из таблицы истории?

Не могли бы вы помочь мне построить SQL-запрос для извлечения данных из таблицы истории?

Я новичок с только недельным опытом кодирования. Я пробовал простые инструкции SELECT до сих пор, но попал в камень преткновения.

База данных моего футбольного клуба состоит из трех таблиц. Первый соединяет шары с игроками:

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

Во втором перечислены вещи, которые происходят с шарами:

 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 | 

И третий – таблица изменений истории. После того, как мяч меняет руки, записывается история:

 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) ... 

Но как убедиться, что Ball 2 также включен, несмотря на то, что он теперь с другим игроком?

 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) 
 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) 
Давайте будем гением компьютера.