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

但是如何确保球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)
点赞