22,209
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE #jzBancAcount(ID int,代码 VARCHAR(20),名称 VARCHAR(20) ,开户日期 Date,期初金额 int,即时余额 int)
INSERT INTO #jzBancAcount values(1,'001','招商账户','2021-03-01',1000,1000)
INSERT INTO #jzBancAcount values(2,'002','建行账户','2021-03-01',2000,2000)
CREATE TABLE #jzShoukuanBill(ID int,银行账户ID int ,收款日期 DATETIME,收款金额 int)
INSERT INTO #jzShoukuanBill values(1,1,'2021-03-01 9:00:00',500)
INSERT INTO #jzShoukuanBill values(2,1,'2021-03-01 10:00:00',300)
INSERT INTO #jzShoukuanBill values(3,1,'2021-03-02 11:00:00',100)
INSERT INTO #jzShoukuanBill values(5,2,'2021-03-01 9:00:00',250)
INSERT INTO #jzShoukuanBill values(6,2,'2021-03-06 9:00:00',350)
CREATE TABLE #jzFukuan(ID int,银行账户ID int ,收款日期 DATETIME,收款金额 int)
INSERT INTO #jzFukuan values(1,1,'2021-03-01 9:10:00',50)
INSERT INTO #jzFukuan values(2,1,'2021-03-01 10:10:00',30)
INSERT INTO #jzFukuan values(3,1,'2021-03-02 11:10:00',10)
INSERT INTO #jzFukuan values(5,2,'2021-03-01 9:10:00',250)
INSERT INTO #jzFukuan values(6,2,'2021-03-06 8:00:00',150)
CREATE TABLE #jzZhuanzhang(ID int,转出银行账户ID int ,转入银行账户ID int ,转账日期 DATETIME,转账金额 int)
INSERT INTO #jzZhuanzhang values(1,2,1,'2021-03-01 9:30:00',250)
INSERT INTO #jzZhuanzhang values(1,1,2,'2021-03-06 8:30:00',150) ;
WITH LiuShui AS (SELECT A.*, B.收款日期, B.收款金额, CAST(0 AS INT) AS 支出金额
FROM #jzBancAcount A
INNER JOIN #jzShoukuanBill B ON A.ID = B.银行账户ID
UNION ALL
SELECT A.*, B.转账日期, B.转账金额, CAST(0 AS INT)
FROM #jzBancAcount A
INNER JOIN #jzZhuanzhang B ON A.ID = B.转入银行账户ID
UNION ALL
SELECT A.*, B.收款日期, CAST(0 AS INT) 收款金额, B.收款金额 AS 支出金额
FROM #jzBancAcount A
INNER JOIN #jzFukuan B ON A.ID = B.银行账户ID
UNION ALL
SELECT A.*, B.转账日期, CAST(0 AS INT), B.转账金额
FROM #jzBancAcount A
INNER JOIN #jzZhuanzhang B ON A.ID = B.转出银行账户ID),
LiuShuiWithSeq AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY LiuShui.代码 ORDER BY LiuShui.收款日期) AS SEQ FROM LiuShui),
Resut AS (SELECT LiuShuiWithSeq.代码,
LiuShuiWithSeq.名称,
LiuShuiWithSeq.收款日期 时间,
LiuShuiWithSeq.期初金额,
LiuShuiWithSeq.收款金额,
LiuShuiWithSeq.支出金额,
LiuShuiWithSeq.即时余额 + LiuShuiWithSeq.收款金额 - LiuShuiWithSeq.支出金额 即时余额,
LiuShuiWithSeq.SEQ
FROM LiuShuiWithSeq
WHERE SEQ = 1
UNION ALL
SELECT A.代码, A.名称, A.收款日期 时间, B.即时余额, A.收款金额, A.支出金额, B.即时余额 + A.收款金额 - A.支出金额 即时余额, A.SEQ
FROM LiuShuiWithSeq A
INNER JOIN Resut B ON A.代码 = B.代码 AND A.SEQ = B.SEQ + 1)
SELECT * FROM Resut ORDER BY Resut.代码, Resut.时间;
drop table #jzBancAcount
drop table #jzShoukuanBill
drop table #jzFukuan
drop table #jzZhuanzhang
WITH CTE
AS
(SELECT *,ROW_NUMBER() OVER (PARTITION BY 银行账户ID ORDER BY 日期) AS SEQ
FROM
(SELECT 银行账户ID,收款日期 AS 日期,收款金额,0 AS 付款金额,1 AS RP_FLAG FROM #jzShoukuanBill
UNION ALL
SELECT 银行账户ID,收款日期 AS 日期,0,收款金额,-1 AS RP_FLAG FROM #jzFukuan
UNION ALL
SELECT 转入银行账户ID,转账日期 AS 日期,转账金额,0,1 AS RP_FLAG FROM #jzZhuanzhang
UNION ALL
SELECT 转出银行账户ID,转账日期 AS 日期,0,转账金额,-1 AS RP_FLAG FROM #jzZhuanzhang) AS A)
SELECT SEQ,
A.日期,B.代码,B.名称,ISNULL(C.SUB_TOTAL+期初金额,期初金额) AS 期初金额,A.收款金额,A.付款金额,
ISNULL(C.SUB_TOTAL+期初金额,期初金额)+RP_FLAG*(付款金额+收款金额) AS 即时余款
FROM CTE A
JOIN #jzBancAcount B ON A.银行账户ID=B.ID
CROSS APPLY (SELECT SUM(RP_FLAG*(付款金额+收款金额)) AS SUB_TOTAL FROM CTE WHERE A.银行账户ID=银行账户ID AND A.SEQ>SEQ) AS C
ORDER BY 银行账户ID,日期
CREATE TABLE #jzBancAcount(ID int,代码 VARCHAR(20),名称 VARCHAR(20) ,开户日期 Date,期初金额 DECIMAL(18,4),即时余额 DECIMAL(18,4))
INSERT INTO #jzBancAcount values(1,'001','招商账户','2021-03-01',1000,1000)
INSERT INTO #jzBancAcount values(2,'002','建行账户','2021-03-01',2000,2000)
CREATE TABLE #jzShoukuanBill(ID int,银行账户ID int ,收款日期 DATETIME,收款金额 DECIMAL(18,4))
INSERT INTO #jzShoukuanBill values(1,1,'2021-03-01 9:00:00',500)
INSERT INTO #jzShoukuanBill values(2,1,'2021-03-01 10:00:00',300)
INSERT INTO #jzShoukuanBill values(3,1,'2021-03-02 11:00:00',100)
INSERT INTO #jzShoukuanBill values(5,2,'2021-03-01 9:00:00',250)
INSERT INTO #jzShoukuanBill values(6,2,'2021-03-06 9:00:00',350)
CREATE TABLE #jzFukuan(ID int,银行账户ID int ,收款日期 DATETIME,收款金额 DECIMAL(18,4))
INSERT INTO #jzFukuan values(1,1,'2021-03-01 9:10:00',50)
INSERT INTO #jzFukuan values(2,1,'2021-03-01 10:10:00',30)
INSERT INTO #jzFukuan values(3,1,'2021-03-02 11:10:00',10)
INSERT INTO #jzFukuan values(5,2,'2021-03-01 9:10:00',250)
INSERT INTO #jzFukuan values(6,2,'2021-03-06 8:00:00',150)
CREATE TABLE #jzZhuanzhang(ID int,转出银行账户ID int ,转入银行账户ID int ,转账日期 DATETIME,转账金额 DECIMAL(18,4))
INSERT INTO #jzZhuanzhang values(1,2,1,'2021-03-01 9:30:00',250)
INSERT INTO #jzZhuanzhang values(1,1,2,'2021-03-06 8:30:00',150) ;
WITH LiuShui AS (SELECT A.*, B.收款日期, B.收款金额, CAST(0 AS DECIMAL(18,4)) AS 支出金额
FROM #jzBancAcount A
INNER JOIN #jzShoukuanBill B ON A.ID = B.银行账户ID
UNION ALL
SELECT A.*, B.转账日期, B.转账金额, CAST(0 AS DECIMAL(18,4))
FROM #jzBancAcount A
INNER JOIN #jzZhuanzhang B ON A.ID = B.转入银行账户ID
UNION ALL
SELECT A.*, B.收款日期, CAST(0 AS DECIMAL(18,4)) 收款金额, B.收款金额 AS 支出金额
FROM #jzBancAcount A
INNER JOIN #jzFukuan B ON A.ID = B.银行账户ID
UNION ALL
SELECT A.*, B.转账日期, CAST(0 AS DECIMAL(18,4)), B.转账金额
FROM #jzBancAcount A
INNER JOIN #jzZhuanzhang B ON A.ID = B.转出银行账户ID),
LiuShuiWithSeq AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY LiuShui.代码 ORDER BY LiuShui.收款日期) AS SEQ FROM LiuShui),
Resut AS (SELECT LiuShuiWithSeq.代码,
LiuShuiWithSeq.名称,
LiuShuiWithSeq.收款日期 时间,
LiuShuiWithSeq.期初金额,
LiuShuiWithSeq.收款金额,
LiuShuiWithSeq.支出金额,
CAST( LiuShuiWithSeq.即时余额 + LiuShuiWithSeq.收款金额 - LiuShuiWithSeq.支出金额 AS DECIMAL(18,4)) 即时余额,
LiuShuiWithSeq.SEQ
FROM LiuShuiWithSeq
WHERE SEQ = 1
UNION ALL
SELECT A.代码, A.名称, A.收款日期 时间, B.即时余额, A.收款金额, A.支出金额, CAST(B.即时余额 + A.收款金额 - A.支出金额 AS DECIMAL(18,4)) 即时余额, A.SEQ
FROM LiuShuiWithSeq A
INNER JOIN Resut B ON A.代码 = B.代码 AND A.SEQ = B.SEQ + 1)
SELECT * FROM Resut ORDER BY Resut.代码, Resut.时间;
drop table #jzBancAcount
drop table #jzShoukuanBill
drop table #jzFukuan
drop table #jzZhuanzhang
CREATE TABLE #jzBancAcount(ID int,代码 VARCHAR(20),名称 VARCHAR(20) ,开户日期 Date,期初金额 int,即时余额 int)
INSERT INTO #jzBancAcount values(1,'001','招商账户','2021-03-01',1000,1000)
INSERT INTO #jzBancAcount values(2,'002','建行账户','2021-03-01',2000,2000)
CREATE TABLE #jzShoukuanBill(ID int,银行账户ID int ,收款日期 DateTIME,收款金额 int)
INSERT INTO #jzShoukuanBill values(1,1,'2021-03-01 9:00:00',500)
INSERT INTO #jzShoukuanBill values(2,1,'2021-03-01 10:00:00',300)
INSERT INTO #jzShoukuanBill values(3,1,'2021-03-02 11:00:00',100)
INSERT INTO #jzShoukuanBill values(5,2,'2021-03-01 9:00:00',250)
INSERT INTO #jzShoukuanBill values(6,2,'2021-03-06 9:00:00',350)
CREATE TABLE #jzFukuan(ID int,银行账户ID int ,收款日期 DateTIME,收款金额 int)
INSERT INTO #jzFukuan values(1,1,'2021-03-01 9:10:00',50)
INSERT INTO #jzFukuan values(2,1,'2021-03-01 10:10:00',30)
INSERT INTO #jzFukuan values(3,1,'2021-03-02 11:10:00',10)
INSERT INTO #jzFukuan values(5,2,'2021-03-01 9:10:00',250)
INSERT INTO #jzFukuan values(6,2,'2021-03-06 8:00:00',150)
CREATE TABLE #jzZhuanzhang(ID int,转出银行账户ID int ,转入银行账户ID int ,转账日期 DateTIME,转账金额 int)
INSERT INTO #jzZhuanzhang values(1,2,1,'2021-03-01 9:30:00',250)
INSERT INTO #jzZhuanzhang values(1,1,2,'2021-03-06 8:30:00',150)
WITH CTE
AS
(SELECT 银行账户ID,收款日期 AS 日期,收款金额,0 AS 付款金额,1 AS RP_FLAG FROM #jzShoukuanBill
UNION ALL
SELECT 银行账户ID,收款日期 AS 日期,0,收款金额,-1 AS RP_FLAG FROM #jzFukuan
UNION ALL
SELECT 转入银行账户ID,转账日期 AS 日期,转账金额,0,1 AS RP_FLAG FROM #jzZhuanzhang
UNION ALL
SELECT 转出银行账户ID,转账日期 AS 日期,0,转账金额,-1 AS RP_FLAG FROM #jzZhuanzhang)
SELECT ROW_NUMBER() OVER (PARTITION BY 银行账户ID ORDER BY 日期) AS SEQ,
A.日期,B.代码,B.名称,ISNULL(C.SUB_TOTAL+期初金额,期初金额) AS 期初金额,A.收款金额,A.付款金额,
ISNULL(C.SUB_TOTAL+期初金额,期初金额)+RP_FLAG*(付款金额+收款金额) AS 即时余款
FROM CTE A
JOIN #jzBancAcount B ON A.银行账户ID=B.ID
CROSS APPLY (SELECT SUM(RP_FLAG*(付款金额+收款金额)) AS SUB_TOTAL FROM CTE WHERE A.银行账户ID=银行账户ID AND A.日期>日期) AS C
ORDER BY 银行账户ID,日期
drop table #jzBancAcount
drop table #jzShoukuanBill
drop table #jzFukuan
drop table #jzZhuanzhang