SQL CASE WHEN查询异常:SUM(CV_Doggo)衍生列无法生成求助
SQL CASE WHEN与窗口函数求和问题修正
问题分析
- CASE表达式返回字符串类型的
'0'/'1',SUM函数无法对字符串进行数值求和,会导致计算异常。 - 窗口函数
OVER (CV_Doggo)语法错误:OVER子句不能直接使用列别名作为分区规则,需明确使用PARTITION BY指定分组逻辑;同时无法引用当前SELECT列表中定义的别名作为分区依据,需重复逻辑或通过子查询/CTE提前计算。 - 冗余逻辑:WHERE条件已过滤
CPTY_RSK_FCTR_MTHDY_TYP为空的行,<=2000和>=2001已覆盖所有非空数值场景,ELSE分支可省略。
修正方案
方案1:直接修正窗口函数逻辑
CASE WHEN CPTY_RSK_FCTR_MTHDY_TYP <= 2000 THEN 0 ELSE 1 END AS CV_Doggo, SUM(CASE WHEN CPTY_RSK_FCTR_MTHDY_TYP <= 2000 THEN 0 ELSE 1 END) OVER (PARTITION BY CASE WHEN CPTY_RSK_FCTR_MTHDY_TYP <= 2000 THEN 0 ELSE 1 END) AS Total_CV_Doggo FROM ia_r_pty @ffdws1p_m.de.db.com WHERE CPTY_RSK_FCTR_MTHDY_TYP IS NOT NULL;
方案2:用CTE简化逻辑(更易维护)
WITH CTE_PtyData AS ( SELECT CASE WHEN CPTY_RSK_FCTR_MTHDY_TYP <= 2000 THEN 0 ELSE 1 END AS CV_Doggo FROM ia_r_pty @ffdws1p_m.de.db.com WHERE CPTY_RSK_FCTR_MTHDY_TYP IS NOT NULL ) SELECT CV_Doggo, SUM(CV_Doggo) OVER (PARTITION BY CV_Doggo) AS Total_CV_Doggo FROM CTE_PtyData;
额外说明
如果需要计算全局所有行的总和(而非按CV_Doggo分组求和),只需移除PARTITION BY子句,改为SUM(CV_Doggo) OVER ()即可。
内容的提问来源于stack exchange,提问作者SlickDaddyTDog
相关产品推荐
相关产品推荐

