mysql - 如何使用 3 个表编写带有连接和条件总和的 mysql 查询
问题描述
我有 3 个保存发票、发票内容和付款的 mysql 表
inv_head(invno,invtot,invgtot)
inv_body(invno,typeid,qty,rate,linetot)
payment(invno,pay_amount,pay_method)
select inv_head.invno,inv_head.invgtot,
sum(CASE WHEN payment.pay_method='CASH' THEN payment.pay_amount ELSE 0 END) AS pay_cash,
sum(CASE WHEN payment.pay_method='CHEQUE' THEN payment.pay_amount ELSE 0 END) AS pay_chq
from inv_head left JOIN payment on inv_head.invno=payment.invno
where invdate between '2019-07-21 00:00:00' and '2019-07-21 23:00:00'
and unprodid=0
GROUP by inv_head.invno
返回以下哪个是正确的
invno invgtot pay_cash pay_chq
20190721-173208-9 242.5 100 100
20190721-174752-9 52 20 10
select inv_head.invno,inv_head.invtot,inv_head.invgtot,
sum(CASE WHEN inv_body.typeid=1 THEN inv_body.line_tot ELSE 0 END) AS stdsaletot,
sum(CASE WHEN inv_body.typeid=2 THEN inv_body.line_tot ELSE 0 END) AS rettot,
sum(CASE WHEN inv_body.typeid=3 THEN inv_body.line_tot ELSE 0 END) AS dmgtot,
sum(CASE WHEN inv_body.typeid=4 THEN (inv_body.qty * inv_body.rate)ELSE 0 END) AS fitot
from inv_head,inv_body
where invdate between '2019-07-21 00:00:00' and '2019-07-21 23:00:00'
and unprodid=0 and inv_head.invno=inv_body.invno
GROUP by inv_head.invno
返回以下哪个是正确的
invno invtot invgtot stdsaletot rettot dmgtot fitot
20190721-173208-9 242.5 242.5 242.5 0 0 0
20190721-174752-9 52 52 291 -168 -71 0
但是当我结合以上两个查询时,
select inv_head.invno,inv_head.invtot,inv_head.invgtot,
sum(CASE WHEN payment.pay_method='CASH' THEN payment.pay_amount ELSE 0 END) AS pay_cash,
sum(CASE WHEN payment.pay_method='CHEQUE' THEN payment.pay_amount ELSE 0 END) AS pay_chq,
sum(CASE WHEN inv_body.typeid=1 THEN inv_body.line_tot ELSE 0 END) AS stdsaletot,
sum(CASE WHEN inv_body.typeid=2 THEN inv_body.line_tot ELSE 0 END) AS rettot,
sum(CASE WHEN inv_body.typeid=3 THEN inv_body.line_tot ELSE 0 END) AS dmgtot,
sum(CASE WHEN inv_body.typeid=4 THEN (inv_body.qty * inv_body.rate)ELSE 0 END) AS fitot
from inv_body,inv_head left JOIN payment on inv_head.invno=payment.invno
where invdate between '2019-07-21 00:00:00' and '2019-07-21 23:00:00'
and unprodid=0 and inv_head.invno=inv_body.invno
GROUP by inv_head.invno
返回低于错误的结果
invno invtot invgtot pay_cash pay_chq stdsaletot rettot dmgtot fitot
20190721-173208-9 242.5 242.5 100 100 727.5 0 0 0
20190721-174752-9 52 52 80 40 873 -504 -213 0
解决方案
您的加入在付款和 inv_head 上正常工作,但在 inv_body 上不起作用,因为您没有提供如何将 inv_body 与其他表加入 试试这个希望会对您有所帮助
SELECT inv_head.invno,inv_head.invtot,inv_head.invgtot,
SUM(CASE WHEN payment.pay_method='CASH' THEN payment.pay_amount ELSE 0 END) AS pay_cash,
SUM(CASE WHEN payment.pay_method='CHEQUE' THEN payment.pay_amount ELSE 0 END) AS pay_chq,
SUM(CASE WHEN inv_body.typeid=1 THEN inv_body.line_tot ELSE 0 END) AS stdsaletot,
SUM(CASE WHEN inv_body.typeid=2 THEN inv_body.line_tot ELSE 0 END) AS rettot,
SUM(CASE WHEN inv_body.typeid=3 THEN inv_body.line_tot ELSE 0 END) AS dmgtot,
SUM(CASE WHEN inv_body.typeid=4 THEN (inv_body.qty * inv_body.rate)ELSE 0 END) AS fitot
FROM payment RIGHT JOIN inv_head ON inv_head.invno=payment.invno
WHERE invdate BETWEEN '2019-07-21 00:00:00' AND '2019-07-21 23:00:00'
AND unprodid=0 LEFT JOIN inv_body ON inv_head.invno=inv_body.invno
GROUP BY inv_head.invno
推荐阅读
- docker - Docker 容器端口未公开
- android - 如何避免 Kotlin 中的指数/科学记数法?
- javascript - How to implement drag and drop behaviour in React
- mysql - 获取字符串日期列的当前月份数据
- swift - Swift CameraView 放大和缩小不起作用
- react-native - React Native 移动应用程序也适用于 Web 和桌面
- java - 搜索在 vaadin UI 之间传递数据的最佳实践
- database - How to check the version of DolphinDB I am using?
- jwt - Auth0 中自定义 API 的优势是什么?
- python - 如何使用 Django 在 Python 中过滤有序字典?