编写数据去重查询:POTENTIAL_MASTER表求和时仅保留TAMIL/TELUGU其一
解决方法
针对你的需求,这里提供几种可靠的SQL实现方式,核心思路是仅保留TAMIL和TELUGU中的一个记录参与求和,避免重复计算:
方法1:分组合并同类产品
把TAMIL和TELUGU合并为一个分组,利用两者潜力值相同的特性,取该组的潜力值后再求和:
SELECT SUM(potential) AS total_potential FROM ( -- 将TAMIL和TELUGU归为同一分组,其他产品保持原样 SELECT CASE WHEN PRODUCT IN ('TAMIL', 'TELUGU') THEN 'INDIA_SOUTH' -- 自定义分组名,不影响结果 ELSE PRODUCT END AS product_group, MAX(potential) AS potential -- 因两者值相同,MAX/MIN/AVG结果一致 FROM POTENTIAL_MASTER GROUP BY product_group ) AS grouped_data;
方法2:通过UNION过滤重复产品
直接排除TELUGU,再结合UNION确保TAMIL被保留(即使之前的过滤逻辑意外漏掉):
SELECT SUM(potential) AS total_potential FROM ( -- 先取除TELUGU外的所有产品 SELECT PRODUCT, POTENTIAL FROM POTENTIAL_MASTER WHERE PRODUCT != 'TELUGU' -- 再单独取TAMIL,UNION会自动去重,不会重复添加 UNION SELECT PRODUCT, POTENTIAL FROM POTENTIAL_MASTER WHERE PRODUCT = 'TAMIL' ) AS unique_products;
方法3:条件过滤(最简单直接)
因为TAMIL和TELUGU潜力值始终相同,直接过滤掉TELUGU即可;如果担心TAMIL不存在的情况,可以加个兜底判断:
SELECT SUM(potential) AS total_potential FROM POTENTIAL_MASTER WHERE PRODUCT != 'TELUGU' -- 兜底:如果TAMIL不存在,才保留TELUGU OR (PRODUCT = 'TELUGU' AND NOT EXISTS (SELECT 1 FROM POTENTIAL_MASTER WHERE PRODUCT = 'TAMIL'));
为什么你之前的DISTINCT/UNION没生效?
如果直接用SUM(DISTINCT potential),会误把其他产品中相同的潜力值也去重;而如果只是简单用UNION后直接求和,可能是因为没正确限定仅排除TELUGU,导致两个产品都被保留。上面的方法都是针对这两个特定产品做精准处理,不会影响其他产品的计算。
内容的提问来源于stack exchange,提问作者Santhosh Sadasivam
相关产品推荐
相关产品推荐

