Oracle查询如何将含付费项目的订单仅统计为付费,不重复计入免费分组
解决方案
实现思路
要实现需求需要先按医生+订单ID维度先判定每个订单的付费属性:只要订单下存在任意非0价格的项目,该订单整体归为Paid分组,仅当订单下所有项目价格都为0时才归为Free分组,之后再基于判定结果做分组统计即可。
完整SQL语句
SELECT physician, COUNT(order_id) AS sum, is_free FROM ( -- 内层先按订单维度判定付费属性 SELECT physician, order_id, CASE WHEN MAX(CASE WHEN price != 0 THEN 1 ELSE 0 END) = 1 THEN 'Paid' ELSE 'Free' END AS is_free FROM "table" -- 若表名不是关键字可去掉双引号,替换为实际表名即可 GROUP BY physician, order_id ) t GROUP BY physician, is_free;
逻辑说明
- 内层子查询通过
MAX(CASE WHEN price !=0 THEN 1 ELSE 0 END)判断每个订单是否存在付费项:只要有任意一条记录价格不为0,返回值就是1,对应标记为Paid,否则标记为Free - 内层子查询已经保证一个
order_id只对应一条记录,外层统计时直接用COUNT(order_id)即可,不需要额外去重 - 最终统计结果和你期望的输出完全一致:Physician1对应2个Free订单,1个Paid订单
内容的提问来源于stack exchange,提问作者JustAnotherNewb
相关产品推荐
相关产品推荐

