如何编写SQL查询计算食材已制备量与剩余量?
正确SQL查询:计算配方已制备量与剩余量
数据表结构与数据
配方表 recipe_tbl:
| Product_ID | Product_Name | Req_Qty | Units |
|---|---|---|---|
| F-0001 | Flour | 120 | gr |
| S-0001 | Sugar | 100 | gr |
制备记录表 prepared_tbl:
| Trans_Code | Trans_Date | Product_ID | Qty | Units |
|---|---|---|---|---|
| t-2302-001 | 2023-02-16 | F-0001 | 10 | gr |
| t-2302-002 | 2023-02-16 | F-0001 | 10 | gr |
| t-2302-003 | 2023-02-16 | S-0001 | 10 | gr |
期望输出
| Product_ID | Product_Name | Req_Qty | Units | Prepared | Remaining |
|---|---|---|---|---|---|
| F-0001 | Flour | 120 | gr | 20 | 100 |
| S-0001 | Sugar | 100 | gr | 10 | 90 |
无效查询问题分析
你当前的查询仅返回了Product_ID和已制备总量,缺少需求中的Product_Name、Req_Qty、Units字段,也没有计算剩余量;同时如果某产品无制备记录,SUM(b.Qty)会返回NULL,导致后续计算异常。
正确SQL查询
SELECT a.Product_ID, a.Product_Name, a.Req_Qty, a.Units, COALESCE(SUM(b.Qty), 0) AS Prepared, a.Req_Qty - COALESCE(SUM(b.Qty), 0) AS Remaining FROM recipe_tbl a LEFT JOIN prepared_tbl b ON a.Product_ID = b.Product_ID GROUP BY a.Product_ID, a.Product_Name, a.Req_Qty, a.Units;
关键说明
LEFT JOIN保留全量配方记录:确保即使产品没有任何制备记录,也会出现在结果集中。COALESCE处理空值:将无制备记录时SUM(b.Qty)返回的NULL转为0,避免剩余量计算出现NULL值。- 完整分组字段:按照SQL标准,
GROUP BY需包含所有非聚合字段,保证查询合法性和结果准确性。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

