【问题标题】:Running balance calculation using window functions with join使用带连接的窗口函数运行余额计算
【发布时间】:2023-01-12 01:13:34
【问题描述】:

我正在尝试找到一种方法来计算帐户的运行余额。 以下是我的架构和我尝试过的查询。

CREATE TABLE transactions(
   id   INTEGER  NOT NULL PRIMARY KEY 
  ,date DATE  NOT NULL
  ,dr   INTEGER  NOT NULL
  ,cr   INTEGER  NOT NULL
  ,amt  INTEGER  NOT NULL
);
CREATE TABLE accounts(
   id   INTEGER  NOT NULL PRIMARY KEY 
  ,name VARCHAR(55)  DEFAULT NULL
);
INSERT INTO accounts(id,name) VALUES (1,'C1');
INSERT INTO accounts(id,name) VALUES (2,'C2');

INSERT INTO transactions(id,date,dr,cr,amt) VALUES (1,'2020-01-01',1,2,100);
INSERT INTO transactions(id,date,dr,cr,amt) VALUES (2,'2020-01-01',1,2,200);

SELECT 
  acc.id, 
  acc.name,
  tx.date,
  SUM(tx.amt) OVER (PARTITION BY tx.date ORDER BY tx.date desc) as balance
FROM 
  accounts acc 
  LEFT JOIN transactions tx ON tx.dr = acc.id;
id name date balance
2 C2
1 C1 2020-01-01 300
1 C1 2020-01-01 300

考虑到借方和贷方帐户,尝试得出如下所示的输出。

id name date balance
1 C1 2020-01-01 300
2 C2 2020-01-01 -300

View on DB Fiddle

【问题讨论】:

  • 这是您需要分组依据而不是 sum()..over 的预期行为
  • -300 来自哪里?
  • 好吧,这就是我想要实现的输出。问题更新得更清楚了。

标签: mysql sql


【解决方案1】:

联合 dr's 和 crs

SELECT 
  acc.id, 
  acc.name, 
  SUM(tx.amt) as balance 
FROM 
  accounts acc 
  JOIN transactions tx ON tx.dr = acc.id
GROUP BY   acc.id,   acc.name
UNION  ALL
SELECT 
  acc.id, 
  acc.name, 
  SUM(tx.amt * -1) as balance 
FROM 
  accounts acc 
  JOIN transactions tx ON tx.CR = acc.id
GROUP BY   acc.id,   acc.name;

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 2014-09-26
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2020-11-26
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多