好吧,首先这可能是一个非常复杂的问题,我会尽量解释清楚,以便你们能最好地帮助我。
这是关于我为生产计划部门开发的软件的数据库。首先我要说明我在这个命令中使用的表,有 4 个表你需要知道:ceramic_transaction(这意味着有陶瓷和交易表)和报告表
Ceramic_transaction
由 3 列组成:Ceramic_id、transaction_id、金额
report
包含:report_id, ceramic_id, transaction_id, amount
ceramic_transaction
表中的金额是客户需要的金额,而report
表中的金额是工作人员完成的金额。
然后我会给你测试的样本数据
Ceramic_transaction
1. CT0046 T201600022 6
2. CT0047 T201600022 6
报告
1. R0001 CT0046 T201600022 3
2. R0001 CT0046 T201600022 2
问题是,我试图减去 worker 已完成的总量并显示需要完成的其余部分(我已经完成),但报告表中可用的其他陶瓷不会显示(甚至没有工作的那个),在本例中是 CT0047
代码示例:
SELECT CT.CERAMIC_ID , IF(CT.CERAMIC_ID = R.CERAMIC_ID, CT.AMOUNT - SUM(R.AMOUNT), CT.AMOUNT) as needs
FROM CERAMIC_TRANSACTION CT, REPORT R
WHERE CT.CERAMIC_ID = R.CERAMIC_ID AND CT.TRANSACTION_ID = R.TRANSACTION_ID GROUP BY CT.CERAMIC_ID
结果
:
CT0046 1
期望的结果
:
CT0046 1
CT0047 6
显然因为 CT0047 没有完成其中任何一个
编辑 1
如果 Ceramic_transaction 中还有其他数据表明 transaction_ID 不相同,则不应显示,这就是为什么我的代码位于 CT.transaction_ID = r.transaction_ID
,我试图在每个 transaction_id
最佳答案
您的问题是您需要使用左连接:
SELECT CT.CERAMIC_ID ,
IF(CT.CERAMIC_ID = R.CERAMIC_ID, CT.AMOUNT - SUM(R.AMOUNT), CT.AMOUNT) as needs
FROM CERAMIC_TRANSACTION CT
LEFT OUTER JOIN REPORT R
ON (CT.CERAMIC_ID = R.CERAMIC_ID
AND CT.TRANSACTION_ID = R.TRANSACTION_ID)
WHERE CT.transaction_id = 'T201600022'
GROUP BY CT.CERAMIC_ID
此问题来自于使用显式连接语法,您应始终避免这样做(表 1、表 2、...)。使用正确的连接语法 that you can read about here.
关于MySQL从多个表中减去相同ID的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35451349/