根据 knex 或 mysql 中的日期获取一行中的总贷方和总借方
Get the total credit and total debit in one row based on date in knex or mysql
考虑以下架构:
DROP TABLE IF EXISTS balance_sheet;
CREATE TABLE `balance_sheet` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`amount` decimal(8,2) NOT NULL,
`type` enum('debit','credit') NOT NULL DEFAULT 'debit',
`remaining_amount` decimal(8,2) NOT NULL,
`shop_id` bigint(20) unsigned NOT NULL,
`sales_man_id` bigint(20) unsigned NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`billing_id` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO balance_sheet VALUES
(124, 40,'debit' ,540, 1,1,'2020-11-27 22:22:08','2020-11-27 22:22:08',82),
(125,290,'credit',250, 1,1,'2020-11-27 22:26:08','2020-11-27 22:26:08',null),
(126,175,'debit' ,675, 3,1,'2020-11-28 05:37:17','2020-11-28 05:37:17',83),
(127,200,'debit' ,500,218,1,'2020-11-28 05:37:40','2020-11-28 05:37:40',84),
(128, 10,'debit' , 15, 2,2,'2020-11-28 08:44:44','2020-11-28 08:44:44',85),
(129,185,'debit' ,385, 20,2,'2020-11-28 08:44:44','2020-11-28 08:44:44',85);
DROP TABLE IF EXISTS salesman;
CREATE TABLE `salesman` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) NOT NULL,
`last_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO salesman VALUES
(1,'Abdulmoiz','Ahmer'),
(2,'Umair','Manzoor');
我想按日期获取业务员的每日记录(他在某个日期借了多少钱,贷了多少钱,该日期的最终余额是多少)。
必填字段:
created_at,贷方,借方,first_name,last_name,sales_man_id
到目前为止我做了什么:
knex('balance_sheet as bs')
.join('salesman as sm', 'bs.sales_man_id', 'sm.id')
.select('bs.sales_man_id', 'bs.type', 'bs.created_at', 'sm.first_name', 'sm.last_name', 'bs.created_at')
.sum('amount as amount')
.groupBy('bs.sales_man_id', 'bs.type')
.groupByRaw('DATE(bs.created_at)');
我所做的结果:
"data": [
{
"sales_man_id": 2,
"type": "debit",
"created_at": "2020-11-28T08:44:44.000Z",
"first_name": "Umair",
"last_name": "Manzoor",
"amount": 195
},
{
"sales_man_id": 1,
"type": "credit",
"created_at": "2020-11-27T22:26:08.000Z",
"first_name": "Abdulmoiz",
"last_name": "Ahmer",
"amount": 290
},
{
"sales_man_id": 1,
"type": "debit",
"created_at": "2020-11-27T22:22:08.000Z",
"first_name": "Abdulmoiz",
"last_name": "Ahmer",
"amount": 415
}
]
如您所见,我的查询正在为同一记录生成两行,一行用于当天的总借记,另一行用于当天的总贷记,但我希望它们位于同一行。如下所示:
"data": [
{
"sales_man_id": 2,
"created_at": "2020-11-28T08:44:44.000Z",
"first_name": "Umair",
"last_name": "Manzoor",
"debit": 195,
"credit": 0,
},
{
"sales_man_id": 1,
"created_at": "2020-11-27T22:26:08.000Z",
"first_name": "Abdulmoiz",
"last_name": "Ahmer",
"credit": 290,
"debit": 415
}
]
如果你不会写一个 knex 查询也没关系,给一个 sql 我会自己转换它。
SELECT s.*
, DATE(b.created_at) created_at
, SUM(CASE WHEN type = 'debit' THEN amount END) debit
, SUM(CASE WHEN type = 'credit' THEN amount END) credit
FROM salesman s
JOIN balance_sheet b
ON b.sales_man_id = s.id
GROUP
BY s.id
, DATE(b.created_at);
+----+------------+-----------+------------+--------+--------+
| id | first_name | last_name | created_at | debit | credit |
+----+------------+-----------+------------+--------+--------+
| 1 | Abdulmoiz | Ahmer | 2020-11-27 | 40.00 | 290.00 |
| 1 | Abdulmoiz | Ahmer | 2020-11-28 | 375.00 | NULL |
| 2 | Umair | Manzoor | 2020-11-28 | 195.00 | NULL |
+----+------------+-----------+------------+--------+--------+
考虑以下架构:
DROP TABLE IF EXISTS balance_sheet;
CREATE TABLE `balance_sheet` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`amount` decimal(8,2) NOT NULL,
`type` enum('debit','credit') NOT NULL DEFAULT 'debit',
`remaining_amount` decimal(8,2) NOT NULL,
`shop_id` bigint(20) unsigned NOT NULL,
`sales_man_id` bigint(20) unsigned NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`billing_id` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO balance_sheet VALUES
(124, 40,'debit' ,540, 1,1,'2020-11-27 22:22:08','2020-11-27 22:22:08',82),
(125,290,'credit',250, 1,1,'2020-11-27 22:26:08','2020-11-27 22:26:08',null),
(126,175,'debit' ,675, 3,1,'2020-11-28 05:37:17','2020-11-28 05:37:17',83),
(127,200,'debit' ,500,218,1,'2020-11-28 05:37:40','2020-11-28 05:37:40',84),
(128, 10,'debit' , 15, 2,2,'2020-11-28 08:44:44','2020-11-28 08:44:44',85),
(129,185,'debit' ,385, 20,2,'2020-11-28 08:44:44','2020-11-28 08:44:44',85);
DROP TABLE IF EXISTS salesman;
CREATE TABLE `salesman` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) NOT NULL,
`last_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO salesman VALUES
(1,'Abdulmoiz','Ahmer'),
(2,'Umair','Manzoor');
我想按日期获取业务员的每日记录(他在某个日期借了多少钱,贷了多少钱,该日期的最终余额是多少)。
必填字段: created_at,贷方,借方,first_name,last_name,sales_man_id
到目前为止我做了什么:
knex('balance_sheet as bs')
.join('salesman as sm', 'bs.sales_man_id', 'sm.id')
.select('bs.sales_man_id', 'bs.type', 'bs.created_at', 'sm.first_name', 'sm.last_name', 'bs.created_at')
.sum('amount as amount')
.groupBy('bs.sales_man_id', 'bs.type')
.groupByRaw('DATE(bs.created_at)');
我所做的结果:
"data": [
{
"sales_man_id": 2,
"type": "debit",
"created_at": "2020-11-28T08:44:44.000Z",
"first_name": "Umair",
"last_name": "Manzoor",
"amount": 195
},
{
"sales_man_id": 1,
"type": "credit",
"created_at": "2020-11-27T22:26:08.000Z",
"first_name": "Abdulmoiz",
"last_name": "Ahmer",
"amount": 290
},
{
"sales_man_id": 1,
"type": "debit",
"created_at": "2020-11-27T22:22:08.000Z",
"first_name": "Abdulmoiz",
"last_name": "Ahmer",
"amount": 415
}
]
如您所见,我的查询正在为同一记录生成两行,一行用于当天的总借记,另一行用于当天的总贷记,但我希望它们位于同一行。如下所示:
"data": [
{
"sales_man_id": 2,
"created_at": "2020-11-28T08:44:44.000Z",
"first_name": "Umair",
"last_name": "Manzoor",
"debit": 195,
"credit": 0,
},
{
"sales_man_id": 1,
"created_at": "2020-11-27T22:26:08.000Z",
"first_name": "Abdulmoiz",
"last_name": "Ahmer",
"credit": 290,
"debit": 415
}
]
如果你不会写一个 knex 查询也没关系,给一个 sql 我会自己转换它。
SELECT s.*
, DATE(b.created_at) created_at
, SUM(CASE WHEN type = 'debit' THEN amount END) debit
, SUM(CASE WHEN type = 'credit' THEN amount END) credit
FROM salesman s
JOIN balance_sheet b
ON b.sales_man_id = s.id
GROUP
BY s.id
, DATE(b.created_at);
+----+------------+-----------+------------+--------+--------+
| id | first_name | last_name | created_at | debit | credit |
+----+------------+-----------+------------+--------+--------+
| 1 | Abdulmoiz | Ahmer | 2020-11-27 | 40.00 | 290.00 |
| 1 | Abdulmoiz | Ahmer | 2020-11-28 | 375.00 | NULL |
| 2 | Umair | Manzoor | 2020-11-28 | 195.00 | NULL |
+----+------------+-----------+------------+--------+--------+