首先,这可能是一个非常复杂的问题,我试图尽可能清楚地解释,以便你们可以帮助我做最好的。
它是关于我为生产计划部门开发的软件数据库。首先,我要说明我在这个命令中使用的表,你需要知道4个表: ceramic_transaction(这意味着有陶瓷和交易表)和报告表
Ceramic_transaction
由3列组成: Ceramic_id,transaction_id,金额
report
由以下内容组成: report_id,ceramic_id,transaction_id,金额
事情是ceramic_transaction
表的数量是客户需要的数量,而report
表上的数量是工人所做的数量。
然后我将为您提供测试的样本数据
Ceramic_transaction
1. CT0046 T201600022 6
2. CT0047 T201600022 6
report
1. R0001 CT0046 T201600022 3
2. R0001 CT0046 T201600022 2
问题是,我试图减去工人完成的总量并显示需要完成的其余工作(我已经完成了),但报告表中可用的其他陶瓷赢了& #39; t出现(即使没有工作的那个),在这种情况下它是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
RESULT
:
CT0046 1
DESIRED RESULTS
:
CT0046 1
CT0047 6
显然是因为CT0047没有完成其中任何一项
编辑1
如果Ceramic_transaction中有其他数据 transaction_ID 不相同,则不应显示,这就是为什么我的代码在CT.transaction_ID = r.transaction_ID
的地方,我试图展示每个transaction_id
答案 0 :(得分:1)
您的问题是您需要使用左连接:
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
这个问题来自使用显式连接语法,你应该总是避免这样做(Table1,table2,...)。使用正确的连接that you can read about here.
语法