SQL Server:如何从历史记录表中获取数据?

SQL Server:如何从历史记录表中获取数据?,sql,sql-server,tsql,Sql,Sql Server,Tsql,你能帮我建立一个SQL查询,从历史记录表中检索数据吗 我是一个只有一周编码经验的新手。到目前为止,我一直在尝试简单的SELECT语句,但遇到了一个绊脚石 我的足球俱乐部的数据库有三个表。第一个链接将球链接到球员: BallDetail | BallID | PlayerID | TeamID | |-------------------|--------| | 1 | 11 | 21 | | 2 | 12 | 22 | 第二个列表列

你能帮我建立一个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也包括在内,尽管现在与另一名球员在一起

不,我不是学生。但是这个例子已经被简化和伪装了,它可能会给你留下这样的印象。你是不是遗漏了一些数据?你在记录投篮、传球等发生的时间。然而,当球换到另一名球员时,你没有记录时间。你是对的,Ek0nomik。HistoryChanges中还有一列:ChangeDate.uups,抱歉,没有看到玩家的变化
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)