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