2013-07-16 63 views
0

我有一個系統可以將歷史記錄存儲到歷史記錄表中。 該表具有帳號,分類代碼,餘額,餘額開始日期,餘額結束日期。 當餘額更新時,會在歷史記錄表中創建一個條目,該條目顯示餘額,該餘額首次開始時的日期以及顯示餘額何時更改的日期。因此,例如,表格將顯示餘額$ 100.00,該餘額從2013年10月7日至2013年7月15日。從最近的可用日期檢索值

我想要做的是獲得所有排序代碼在特定日期的餘額總和,但餘額可能在此日期沒有變化,所以我需要返回最近的日期,米失敗。

這是我到目前爲止所嘗試的。

declare @sdate datetime 
set @sdate = '06/08/2012' --mm/dd/yyyy 

SELECT CONVERT(varchar(20),MAX(StartDate),103) as "Closest Start Date", Sort, SUM(Balance) AS "Sum of balances" 
    FROM BalanceHistory 
     WHERE StartDate <= convert(smalldatetime ,@sdate) AND SortCode <> 'ABC123456' 
      GROUP BY SortCode 

選擇BalanceHistory會產生類似

AccountNumber, SortCode, Balance, StartDate, EndDate, RECID 
00000001, srt010203, 100.00, 06/01/2013, 06/02/2013, RECID 
00000001, srt010203, 110.00, 06/02/2013, 06/03/2013, RECID 
00000001, srt010203, 120.00, 06/03/2013, 06/04/2013, RECID 
00000002, srt010204, 200.00, 06/01/2013, 06/02/2013, RECID 
00000003, srt010204, 300.00, 06/01/2013, 06/02/2013, RECID 
00000004, srt010205, 400.00, 06/01/2013, 06/02/2013, RECID 
00000005, srt010205, 500.00, 06/01/2013, 06/02/2013, RECID 
+0

根據上面的示例表,您希望的輸出看起來像什麼? –

回答

1

你可以做到這一點沒有一個JOIN(假設SQL Server 2005或更新):

DECLARE @sdate DATE 
SET @sdate = '2012-06-08' 
SELECT SortCode, SUM(Balance)'Sum of Balances' 
FROM (SELECT AccountNumber,SortCode, Balance,ROW_NUMBER() OVER (PARTITION BY AccountNumber ORDER BY StartDate DESC)'RowRank' 
     FROM BalanceHistory 
     WHERE StartDate <= @sdate AND SortCode <> 'ABC123456' 
    )sub 
WHERE RowRank = 1 
GROUP BY SortCode 

演示:SQL Fiddle

子查詢的ROW_NUMBER()功能分配「RowRank」爲每個ACCOUNTNUMBER的平衡,我們訂購的起始日期DESC獲得的「1」排名最近一個平衡每個ACCOUNTNUMBER,在WHERE條件將其限制爲從您在變量中設置的日期開始的最近餘額。然後,您在外部查詢中使用該等級來限制僅限於該一個餘額。

+0

該表格由以下部分組成: 帳號,排序代碼,餘額,開始日期,結束日期 我試圖在特定日期(或最近的日期)獲取每個現有排序代碼的所有餘額的總和到它)...但我很難過,因爲餘額歷史可能在當天沒有改變,所以我需要檢查最近的可用日期條目。例如,如果我想在7月1日看到餘額,但餘額自6月15日或其他日期以來沒有更新過。 – totalfreakingnoob

+0

帳戶是否可以有多個基於排序代碼的餘額? –

+0

1個帳戶可以有1個排序代碼,但1個排序代碼可以有多個帳戶。 1個賬戶餘額。 ......除非你是在這張桌子上。歷史記錄表爲每個餘額更新創建一個新行,因此它也顯示歷史記錄,因此該表可以爲每個帳戶保留多個餘額,但我只對最接近指定日期的興趣感興趣。 – totalfreakingnoob

0

這應該通過使用ROW_NUMBER()功能工作

Declare @table as table 
(AccountNo int, 
Balance money, 
DateEntered datetime) 

Declare @dt datetime 

set @dt = '2013-07-01' 
Insert into @table values(1, 100, '2013-04-01') 
Insert into @table values(2, 200, '2013-04-01') 
Insert into @table values(2, 300, '2013-05-01') 
Insert into @table values(2, 400, '2013-06-01') 
    --select AccountNo, Max(Balance), Max(DateEntered) MaxDateEntered From @table where DateEntered <= @dt group by AccountNo 


Select Sum(t.Balance) From @table t 
inner join (select AccountNo, Max(Balance) Balance, Max(DateEntered) MaxDateEntered From @table where DateEntered <= @dt group by AccountNo) tm 
on t.AccountNo = tm.AccountNo and t.DateEntered = tm.MaxDateEntered 

    enter code here