我有以下表格:
id dr cr balance txn_date
1 0.00 0.00 31895532.96 12/20/2013
2 15000.00 0.00 31880532.96 12/20/2013
3 102120.00 0.00 31778412.96 12/20/2013
4 15250.00 0.00 31763162.96 12/20/2013
5 75000.00 0.00 25761370.96 12/22/2013
6 98600.00 0.00 25662770.96 12/22/2013
7 71460.00 0.00 25591310.96 12/22/2013
8 518400.00 0.00 25072910.96 12/22/2013
9 35000.00 0.00 25037910.96 12/22/2013
我需要在输入日期时找到期初余额。例如,当输入12/20/2013
时,期初余额为31895532.96
。
没有必要每天进行交易。我们在21st December 2013
也没有交易,在这种情况下,我们需要平衡12/20/2013
的最后一笔交易,即31763162.96
。有什么想法如何实现呢?
我为12/20/2013
执行了以下操作:
select top 1 balance
from banks
where txn_date = '12/20/2013' order by id
现在当我来12/21/2013
时,那天没有交易。因此,上一个日期的最后一笔交易(不一定是昨天可能是任何日期,取决于交易日期)应该是平衡,即31763162.96
:
select top 1 balance
from banks
where txn_date <= '12/21/2013' order by id desc
它返回了上一个日期12.21.2013
如何合并上述两个查询以满足这两个条件?
答案 0 :(得分:0)
您没有提供有关31895532.96
输入12/20/2013
的原因的任何信息。在您的示例中,您有多个具有相同txn_date
值的记录
在以下查询中,我在满足txn_date
条件的记录中选择任意值。
SELECT TOP 1 balance
FROM banks
WHERE txn_date = @argumentDate
在此示例中,@argumentDate
是任何比较日期(问题中为12/20/2013
)。
修改强>:
假设您的txn_date
列是DateTime列,而不仅仅是您可以使用的字符串:
SELECT TOP 1 balance
FROM banks
WHERE DATEDIFF(DAY , txn_date , @argumentDate ) <=0
ORDER BY DATEDIFF(DAY , txn_date , @argumentDate ) DESC
答案 1 :(得分:0)
使用CTE可以得到逻辑
with cte (DR,CR,Balance,TxnDate,RowID ) as
(
select DR,CR,Balance,TxnDate,Row_number() over (PARTITION by txndate order by txndate desc) as RowID
from Trans
)
select top 1 Balance
from cte
where TxnDate = case when @TXNDATE = '12/20/2013' then (select top 1 TxnDate from Cte where @TXNDATE = '12/20/2013')
when @TXNDATE > '12/20/2013' then (select top 1 TxnDate from Cte where TXNDATE='12/20/2013' ) end
ORDER BY
case when @TXNDATE = '12/20/2013' then RowID end ASC,
case when @TXNDATE > '12/20/2013' then RowID end Desc