有点难度!求助查询一个银行账户交易的sql语句

低代码开发平台 2021-03-03 09:52:45
银行账户表jzBancAcount(主键ID,代码,名称,开户日期,期初金额,即时余额)

收款表:jzShoukuanBill(主键ID,收款日期,收款金额,银行账户ID)

付款表:jzFukuan(主键ID,付款日期,付款金额,银行账户ID)

转账表:jzZhuanzhang(主键ID,转账日期,转出银行账户,转入银行账户,转账金额)

求一个银行的交易流水按日期排序
结果如下:
交易序号(按流水增长从1开始),日期,账户代码,账户名称,之前金额 收款 付款 即时余额
...全文
705 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hello World, 2021-03-04
  • 打赏
  • 举报
回复
先组成流水,再计算出各项的结余:

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
RINK_1 2021-03-04
  • 打赏
  • 举报
回复
引用 8 楼 富莱尔软件 的回复:
[quote=引用 4 楼 RINK_1 的回复:]


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


这个遇到两个日期一模一样的就会有问题,我测试数据稍微改下。 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:00: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:00: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 [/quote] 那就一上来就排序


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,日期
  • 打赏
  • 举报
回复
引用 4 楼 RINK_1 的回复:


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


这个遇到两个日期一模一样的就会有问题,我测试数据稍微改下。 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:00: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:00: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
Hello World, 2021-03-04
  • 打赏
  • 举报
回复
引用 6 楼 富莱尔软件 的回复:
[quote=引用 3 楼 Hello World, 的回复:]先组成流水,再计算出各项的结余:

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
这里换个数据类型就报错了![/quote] 把类型整成一样的就可以了

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
  • 打赏
  • 举报
回复
引用 3 楼 Hello World, 的回复:
先组成流水,再计算出各项的结余:

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
这里换个数据类型就报错了!
  • 打赏
  • 举报
回复
CREATE TABLE #jzBancAcount(ID int,代码 VARCHAR(20),名称 VARCHAR(20) ,开户日期 Date,期初金额 decimal,即时余额 decimal) 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) 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) 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) 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) AS 支出金额 FROM #jzBancAcount A INNER JOIN #jzShoukuanBill B ON A.ID = B.银行账户ID UNION ALL SELECT A.*, B.转账日期, B.转账金额, CAST(0 AS decimal) FROM #jzBancAcount A INNER JOIN #jzZhuanzhang B ON A.ID = B.转入银行账户ID UNION ALL SELECT A.*, B.收款日期, CAST(0 AS decimal) 收款金额, B.收款金额 AS 支出金额 FROM #jzBancAcount A INNER JOIN #jzFukuan B ON A.ID = B.银行账户ID UNION ALL SELECT A.*, B.转账日期, CAST(0 AS decimal), 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 换个数据类型就报错了,因为金额一般不是整数型
RINK_1 2021-03-04
  • 打赏
  • 举报
回复


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


  • 打赏
  • 举报
回复
最后一个序号错了,14
  • 打赏
  • 举报
回复
/* 银行账户表jzBancAcount(主键ID,代码,名称,开户日期,期初金额,即时余额) 收款表:jzShoukuanBill(主键ID,收款日期,收款金额,银行账户ID) 付款表:jzFukuan(主键ID,付款日期,付款金额,银行账户ID) 转账表:jzZhuanzhang(主键ID,转账日期,转出银行账户,转入银行账户,转账金额) 求一个银行的交易流水按日期排序 结果如下: 交易序号(按流水增长从1开始),日期,账户代码,账户名称,之前金额 收款 付款 即时余额 */ 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 ,收款日期 Date,收款金额 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 ,收款日期 Date,收款金额 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 ,转账日期 Date,转账金额 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) /*求一个sql语句得到如下结果*/ 序号 日期 账户代码 账户名称 期初金额 收款 付款 即时余款 1 2021-03-01 9:00:00 001 招商账户 1000 500 0 1500 2 2021-03-01 9:10:00 001 招商账户 1500 0 50 1450 3 2021-03-01 9:30:00 001 招商账户 1450 250 0 1700 4 2021-03-01 10:00:00 001 招商账户 1700 300 0 2000 5 2021-03-01 10:10:00 001 招商账户 2000 0 30 1970 6 2021-03-02 11:00:00 001 招商账户 1970 100 0 2070 7 2021-03-02 11:10:00 001 招商账户 2070 0 10 2060 8 2021-03-06 8:30:00 001 招商账户 2060 0 150 1910 9 2021-03-01 9:00:00 002 建行账户 2000 250 0 2250 10 2021-03-01 9:10:00 002 建行账户 2250 0 250 2000 11 2021-03-01 9:30:00 002 建行账户 2000 0 250 1750 12 2021-03-06 8:00:00 002 建行账户 1750 0 150 1600 13 2021-03-06 8:30:00 002 建行账户 1600 150 0 1750 13 2021-03-06 9:00:00 002 建行账户 1750 350 0 2100 drop table #jzBancAcount drop table #jzShoukuanBill drop table #jzFukuan drop table #jzZhuanzhang

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧