MySQL两张生产表多条件统计合并生成视图表的实现方案咨询
实现方案
这个需求完全可以实现,核心思路是通过条件聚合分别统计两张表的指标,再按生产日期关联合并即可,相比单独跑三个统计查询性能更高。
实现步骤
- 聚合计算表1的每日总订单、皮革订单数:不用分开写两个查询,用条件计数一次算出两个指标
- 聚合计算表2的每日皮革类出入库数量:同样用条件计数分别统计入库、出库的总数
- 用
production_date作为关联键,将两个聚合结果左连接,避免某张表当日无数据时结果缺失 - 过滤当日数据,并用
IFNULL处理空值,最后计算结余字段
完整SQL代码(可直接创建视图)
CREATE VIEW daily_production_stats AS SELECT t1.production_date, t1.total_order, t1.total_leather_order, IFNULL(t2.total_in, 0) AS total_in, IFNULL(t2.total_out, 0) AS total_out, (t1.total_leather_order - IFNULL(t2.total_out, 0)) AS balance FROM ( -- 统计表1的每日总订单、皮革订单数 SELECT production_date, COUNT(*) AS total_order, SUM(IF(material = 'leather', 1, 0)) AS total_leather_order FROM table1 GROUP BY production_date ) t1 LEFT JOIN ( -- 统计表2的每日皮革类出入库数 SELECT production_date, SUM(IF(prouction_status = 'in', 1, 0)) AS total_in, SUM(IF(prouction_status = 'out', 1, 0)) AS total_out FROM table2 WHERE production_type = 'leather' GROUP BY production_date ) t2 ON t1.production_date = t2.production_date -- 仅保留当日数据 WHERE t1.production_date = CURDATE();
注意事项
- 你提供的表2字段
prouction_status疑似拼写错误(正确应为production_status),如果实际表中字段名正确请自行修改 - 用
IFNULL处理表2的空值,避免当日没有皮革类完工数据时,出入库字段和结余计算出现NULL - 如果需要查所有历史日期的统计,删除最后的
WHERE t1.production_date = CURDATE()条件即可
内容的提问来源于stack exchange,提问作者Ali Im
相关产品推荐
相关产品推荐

