如何获取SQL服务器的累计记录?
How to get cumulative record In SQL Server?
我在 SQL 服务器中有一些数据,格式如下。
declare @statement table
(
acctno int,
statDate date,
tod int,
lastDate date
)
insert into @statement select 123,'2018-02-12',567,'2018-01-12'
insert into @statement select 123,'2018-03-12',580,'2018-02-12'
insert into @statement select 123,'2018-04-12',567,'2018-03-12'
--select * from @statement
declare @txn table
(
acct int,
txndate date,
amount int
)
insert into @txn select 123,'2018-02-11',400
insert into @txn select 123,'2018-02-18',400
insert into @txn select 123,'2018-02-25',400
insert into @txn select 123,'2018-03-11',400
insert into @txn select 123,'2018-03-25',400
两个表的结果类似如下。
]1
现在我想要如下所示的结果:
我正在尝试通过此查询获取它:
;with cte as
(
select
acctno, statDate, tod, txndate, amount, lastDate
from
@statement
inner join
@txn on acctno = acct
)
select *
from @txn t
left join cte on acct = acctno
and t.txndate between statDate and lastDate
但是结果没有按预期返回 - 请帮我得到想要的结果。
我认为你可以更简单地做到这一点
select s.acctno,statDate,tod,txndate,amount,lastDate
from @txn t
Inner join @statement s
On s.acctno = t.acct
And t.txndate Between s.lastDate and s.startDate
您可能需要将 BETWEEN 更改为“<”以进行开始日期比较。
这是一个经典的 DKNF 连接:
WITH TD AS(
SELECT T1.acctno, T1.statDate AS StartDate, T1.tod, COALESCE(MAX(T2.statDate), '1-01-01') AS BeforeDate
FROM @statement AS T1
LEFT OUTER JOIN @statement AS T2
ON T1.acctno = T2.acctno AND T1.statDate < T2.statDate
GROUP BY T1.acctno, T1.statDate, T1.tod
)
SELECT acctno, StartDate, tod, txndate, amount
FROM TD
JOIN @txn AS t
ON TD.acctno = t.acct AND txndate <= StartDate AND txndate > BeforeDate
我在 SQL 服务器中有一些数据,格式如下。
declare @statement table
(
acctno int,
statDate date,
tod int,
lastDate date
)
insert into @statement select 123,'2018-02-12',567,'2018-01-12'
insert into @statement select 123,'2018-03-12',580,'2018-02-12'
insert into @statement select 123,'2018-04-12',567,'2018-03-12'
--select * from @statement
declare @txn table
(
acct int,
txndate date,
amount int
)
insert into @txn select 123,'2018-02-11',400
insert into @txn select 123,'2018-02-18',400
insert into @txn select 123,'2018-02-25',400
insert into @txn select 123,'2018-03-11',400
insert into @txn select 123,'2018-03-25',400
两个表的结果类似如下。
现在我想要如下所示的结果:
我正在尝试通过此查询获取它:
;with cte as
(
select
acctno, statDate, tod, txndate, amount, lastDate
from
@statement
inner join
@txn on acctno = acct
)
select *
from @txn t
left join cte on acct = acctno
and t.txndate between statDate and lastDate
但是结果没有按预期返回 - 请帮我得到想要的结果。
我认为你可以更简单地做到这一点
select s.acctno,statDate,tod,txndate,amount,lastDate
from @txn t
Inner join @statement s
On s.acctno = t.acct
And t.txndate Between s.lastDate and s.startDate
您可能需要将 BETWEEN 更改为“<”以进行开始日期比较。
这是一个经典的 DKNF 连接:
WITH TD AS(
SELECT T1.acctno, T1.statDate AS StartDate, T1.tod, COALESCE(MAX(T2.statDate), '1-01-01') AS BeforeDate
FROM @statement AS T1
LEFT OUTER JOIN @statement AS T2
ON T1.acctno = T2.acctno AND T1.statDate < T2.statDate
GROUP BY T1.acctno, T1.statDate, T1.tod
)
SELECT acctno, StartDate, tod, txndate, amount
FROM TD
JOIN @txn AS t
ON TD.acctno = t.acct AND txndate <= StartDate AND txndate > BeforeDate