如何合并两段相似SQL查询简化代码 可否用CASE实现条件计数
SQL合并实现方案
完全可以通过CASE语句实现两段查询的合并,不需要依赖COUNT_IF函数,最终统计结果和分开执行两段查询完全一致,还能减少表扫描次数提升执行效率。
实现逻辑
- 保留两段查询共有的逻辑:table_1与table_2按order_id关联、筛选订单状态为
PROCESSING/COMPLETED、按ID分组 - 把两个查询不同的
fullfilled_cd筛选值统一放到WHERE条件的IN列表中,不需要分两次过滤 - 统计字段使用
COUNT(DISTINCT + CASE)的写法:当行数据的fullfilled_cd匹配目标统计值时返回order_id,不匹配时返回NULL,COUNT会自动忽略NULL值,实现分类型的去重计数
合并后的SQL代码
SELECT B.ID, COUNT(DISTINCT CASE WHEN B.fullfilled_cd = 'DELIVERY' THEN A.order_id END) AS delivery_order_count, COUNT(DISTINCT CASE WHEN B.fullfilled_cd = 'PURCHASE' THEN A.order_id END) AS purchase_order_count FROM table_1 B JOIN table_2 A ON A.order_id = B.order_id WHERE A.order_status IN ('PROCESSING', 'COMPLETED') AND B.fullfilled_cd IN ('DELIVERY', 'PURCHASE') GROUP BY B.ID;
注:原两段示例SQL的WHERE子句开头存在多余的AND语法问题,上述合并代码已同步修正。
内容的提问来源于stack exchange,提问作者Jenifer
相关产品推荐
相关产品推荐

