如何筛选同时在2022-08-31和2023-08-31有采购的客户
筛选双时段均有非零采购的客户
需求说明
需要找出同时在2022年8月31日和2023年8月31日有非零采购记录的客户,涉及字段:Report_Month(报告日期)、unit_Revenue(采购金额)、cl_code(客户编码)。
错误尝试的问题
你之前用的HAVING子句逻辑存在两处问题:一是运算符优先级导致条件判断偏离预期(OR优先级低于AND),二是没有按客户分组后分别校验两个时段的非零采购要求:
Having Report_Month = '2022-08-31' or Report_Month = '2023-08-31' and Sum(unit_Revenue) <> 0 and Sum(unit_Revenue) is not null
这个条件会返回所有在两个时段中任意一个有非零采购的客户,而非同时满足两个时段要求的客户。
正确解法
方法1:条件聚合筛选(带明细统计)
按客户编码分组,分别统计两个时段的采购金额,再筛选出两个金额都大于0的客户:
SELECT cl_code, SUM(CASE WHEN Report_Month = '2022-08-31' THEN unit_Revenue ELSE 0 END) AS "2022年8月", SUM(CASE WHEN Report_Month = '2023-08-31' THEN unit_Revenue ELSE 0 END) AS "2023年8月", CASE WHEN SUM(CASE WHEN Report_Month = '2022-08-31' THEN unit_Revenue ELSE 0 END) > 0 AND SUM(CASE WHEN Report_Month = '2023-08-31' THEN unit_Revenue ELSE 0 END) > 0 THEN '是' ELSE '否' END AS "是否应纳入" FROM 你的表名 WHERE Report_Month IN ('2022-08-31', '2023-08-31') GROUP BY cl_code HAVING SUM(CASE WHEN Report_Month = '2022-08-31' THEN unit_Revenue ELSE 0 END) > 0 AND SUM(CASE WHEN Report_Month = '2023-08-31' THEN unit_Revenue ELSE 0 END) > 0;
方法2:EXISTS子查询(仅返回客户编码)
如果只需要客户编码结果,用子查询验证每个客户在两个时段都有非零采购:
SELECT DISTINCT cl_code FROM 你的表名 t1 WHERE Report_Month = '2022-08-31' AND unit_Revenue > 0 AND EXISTS ( SELECT 1 FROM 你的表名 t2 WHERE t2.cl_code = t1.cl_code AND t2.Report_Month = '2023-08-31' AND t2.unit_Revenue > 0 );
预期示例结果
| cl_Code | 2022年8月 | 2023年8月 | 是否应纳入 |
|---|---|---|---|
| 3001 | 0 | 44.32 | 否 |
| 101001 | 42.94 | 90.68 | 是 |
| 115001 | 298 | 685 | 是 |
| 121921 | 18.24 | 0 | 否 |
| 123818 | 30.5 | 28 | 是 |
| 123819 | 1204.66 | 94.9 | 是 |
| 202004 | 67.1 | 0 | 否 |
| 202008 | 277.28 | 282.14 | 是 |
| 247008 | 16.8 | 0 | 否 |
| 247009 | 6.1 | 0 | 否 |
| 247012 | 214.6 | 196.75 | 是 |
| 288001 | 786.54 | 633.95 | 是 |
| 360008 | 160.24 | 0 | 否 |
| 360009 | 81.44 | 0 | 否 |
| JFM | 75.6 | 160.2 | 是 |
内容的提问来源于stack exchange,提问作者Fazza
相关产品推荐
相关产品推荐

