mysql 计算余额与窗口函数对联合选择

jhiyze9q  于 2023-01-12  发布在  Mysql
关注(0)|答案(1)|浏览(98)

我在MySQL 8中有以下2个表:
网址:https://www.db-fiddle.com/f/fejdb5mcCm4TUFDacU3R3M/0

    • 表一**
SELECT * FROM table1

| 身份证|信贷|借项|公司|
| - ------|- ------|- ------|- ------|
| 1个|一百|无|1个|
| 第二章|二百|无|1个|
| 四个|一百|无|1个|
| 五个|一万|无|第二章|
| 七|五十|无|1个|
表2

SELECT * FROM table2

| 身份证|信贷|借项|公司|
| - ------|- ------|- ------|- ------|
| 1个|无|五十|1个|
| 第二章|无|一百|1个|
| 三个|无|五十|1个|
| 七|无|三万|第二章|
| 八个|无|二百|1个|
我想在company = 1的union select上生成一个Balance列,如下所示,这意味着余额为:* * 末行余额+贷方-借方**

SELECT id, credit, debit, company, SUM(credit - debit) OVER (ORDER BY id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS balance FROM (
SELECT id, credit, debit, company FROM table1 
UNION ALL
SELECT id, credit, debit, company  FROM table2  
) AS u WHERE company=1

| 身份证|信贷|借项|公司|余额|正确平衡|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 1个|一百|无|1个|一百|一百|
| 1个|无|五十|1个|五十|五十|
| 第二章|无|一百|1个|一百五十|-50|
| 第二章|二百|无|1个|一百|一百五十|
| 三个|无|五十|1个|一百五十|一百|
| 四个|一百|无|1个|五十|二百|
| 七|五十|无|1个|一百五十|二百五十|
| 八个|无|二百|1个|一百五十|五十|
余额的结果不正确(我手动添加了正确的余额),我的方法有什么问题,如何解决?
DDL:

CREATE TABLE `table1` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `credit` int(4) DEFAULT NULL,
  `debit` int(4) DEFAULT NULL,
  `company` int(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

/*Data for the table `table1` */

insert  into `table1`(`id`,`credit`,`debit`,`company`) values 
(1,100,0,1),
(2,200,0,1),
(4,100,0,1),
(5,10000,0,2),
(7,50,0,1);

CREATE TABLE `table2` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `credit` int(4) DEFAULT NULL,
  `debit` int(4) DEFAULT NULL,
  `company` int(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

/*Data for the table `table2` */

insert  into `table2`(`id`,`credit`,`debit`,`company`) values 
(1,0,50,1),
(2,0,100,1),
(3,0,50,1),
(7,0,30000,2),
(8,0,200,1);
1l5u6lss

1l5u6lss1#

问题是我们没有办法辨别ID应该以什么顺序放置以计算运行总数。
我们可以这样做,控制我们首先使用哪个表;但更好的方法是使用事务日期/时间字段,这样我们就可以在ID之后按它排序,从而提供事件的真实顺序。
Lemon之前在评论中问过类似的问题,我只是展示了这是如何实现的,以及为什么我们在你的预期结果中纠结于顺序,既然你的预期结果与这个的结果不匹配;请重新考虑预期结果。请指明顺序并不重要,或确定我们可以如何排序(先按t1或t2排序..,或按ID后面未定义的日期时间字段排序...)

SELECT id, credit, debit, company, SUM(credit - debit) OVER (partition by company ORDER BY id, src) AS balance FROM (
SELECT id, 't1' src, credit, debit, company FROM table1 
UNION ALL
SELECT id, 't2' src, credit, debit, company  FROM table2  
) AS u WHERE company=1

相关问题