我有两个表,并在customer_id上加入它们。
第一个表是交易,我在其中存储交易的数据。而且每笔交易都有交易额和休息额,支付额等等。
第二个表是handle,对我来说很难解释该表的用途,但是handle表是同一交易表,并且具有volume_handle,rest_handle,pay_handle等。
我必须使用左联接,因为我想要交易表中的所有记录以及句柄表中的匹配记录
我要对交易量和交易余量求和,对交易柄的volume_handle求和,这些表之间的关系是customer_id和buy_id。
例如交易表:
import 'dart:convert' show json;
import 'package:shared_preferences/shared_preferences.dart';
void setList(
String key, List<dynamic> value) async {
await setString(key, json.encode(value));
}
setList('key', []);
并且句柄表是:
id = 1
volume = 1000
rest = 1000
customer_id = 1
---------------
id = 2
volume = 500
rest = 0
customer_id = 1
---------------
id = 3
volume = 2000
rest = 0
customer_id = 2
我写的查询是:
id = 1
volume_handle = 3000
buy_id = 1
,此查询的结果是:
select sum(deal.rest) as rest , sum(deal.volume) as volume , sum(handle.volume_handle) as handle
from deal
left join handle on deal.customer_id = handle.buy_id
group by deal.customer_id;
音量和其余部分都正确,但是第二个表的句柄是错误的,因为sum(handle.volume_handle)的结果是3000而不是6000(当customer_id为1时)
而且我不知道在连接表之前如何使用聚合函数。
这里的任何人都可以为此问题写查询吗?
答案 0 :(得分:2)
由于每个handle
值在deal.customer_id
中可以有多行,因此您需要先在该表中执行汇总,然后再将JOIN
汇总到{{ 1}}。像这样:
deal
输出:
SELECT d.customer_id,
SUM(d.rest) AS rest,
SUM(d.volume) AS volume,
MAX(h.volume_handle) AS handle
FROM deal d
LEFT JOIN (SELECT buy_id, SUM(volume_handle) AS volume_handle
FROM handle
GROUP BY buy_id) h ON h.buy_id = d.customer_id
GROUP BY d.customer_id
请注意,我在customer_id rest volume handle
1 1000 1500 3000
2 0 2000 null
附近使用了MAX
,这不会改变结果(因为它将测试的所有值都相同),但是必须避免使用任何{{1 }}错误。