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