Mysql Sql查询以获取两个表中总计的数据差异
我有两张桌子: 预订-记录订单详细信息Mysql Sql查询以获取两个表中总计的数据差异,mysql,sql,join,inner-join,Mysql,Sql,Join,Inner Join,我有两张桌子: 预订-记录订单详细信息 id | booking_amount ------------------- 1 | 150 2 | 500 3 | 400 付款-记录订单的付款 id | booking_id | amount ------------------------ 1 | 1 | 100 2 | 1 | 50 2 | 2 |
id | booking_amount
-------------------
1 | 150
2 | 500
3 | 400
付款-记录订单的付款
id | booking_id | amount
------------------------
1 | 1 | 100
2 | 1 | 50
2 | 2 | 100
我想查找所有付款未完成的预订。根据上述数据,我们预计答案为2,3,因为预订id=1的付款总额与预订表中相应的预订金额相匹配。您需要使用外部联接来组合两个表并查找您的条件。此外,您还需要使用SUM。。函数获取付款表中每个id的金额总和 请试试这个:
select b.id from booking b
left outer join -- cant be inner join because we lose id:3 in that case.
(
select booking_id, SUM(amount) as Total
from payment group by booking_id
) p on b.id = p.booking_id
where b.booking_amount > Coalesce(Total,0) --Coalesce is required for such values coming NULL, like id:3, they will be assigned as 0.
要回答您的问题,您需要考虑两件事: 您希望表中的总金额按每个预订行付款 您想将您的预订金额表加入付款 第1部分非常简单:
SELECT sum(amount) as TotalP, booking_id FROM payment GROUP BY booking_id
只是一个带有简单聚合函数的基本查询
对于第2部分,我们希望加入订票金额和付款;基本连接将是:
SELECT * FROM booking b
LEFT JOIN payment p ON b.id = p.booking_id
我们做一个左加入,因为我们可能有一些不在付款表中的预订。对于这些预订,您将得到空值。我们将使用合并将空值替换为0
最后一个问题是:
SELECT b.id, COALESCE(TotalP, 0), b.booking_amount
FROM
booking b
LEFT JOIN
(SELECT sum(amount) as TotalP, booking_id FROM payment GROUP BY booking_id) as T
ON b.id = T.booking_id
WHERE COALESCE(TotalP, 0) < b.booking_amount
我不明白你到底想要什么。你的答案是2,3吗?请再次检查我的问题。我在尝试时添加了屏幕快照。它显示错误组功能无效。我更改了。但只是通知说它基本上打开了Jean的答案。稍后我将寻找另一种方法并再次更新我的答案。是的,我认为没有更好的解决方案。虽然此代码可能会回答此问题,但提供有关为什么和/或如何回答此问题的其他上下文将显著提高其长期价值。请你的答案加上一些解释。很好,它将帮助我写sql查询。