2012-11-08 146 views
4

你能帮我建立一个SQL查询来从历史表中检索数据吗?SQL Server:我如何从历史记录表中获取数据?

我是一个只有一周编码经验的新手。我一直在尝试简单的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 | 

我试图获取表将列出所有的传球和射门Player 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也被包括在内,尽管现在有另一名球员是?

+0

这气味像功课! –

+0

不,我不是学生。但这个例子已经被简化和伪装了,它可能会给你这种印象。 –

+0

您是不是在这里错过了一些数据?您正在跟踪拍摄,通过等发生的时间。但是,你没有记录球变成不同球员的时间。 –

回答

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) 
+0

uups,抱歉,没有看到球员的变化 – bummi

+0

谢谢你试图帮助! –

+0

现在对我来说似乎是正确的....希望你可以使用或适应它 – bummi

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) 
相关问题