如何在现有SQL查询中新增SRCC_RATIO与Exposure相乘的列?
解决方案
当然可以新增这个乘积计算列,给你几种实用的实现方式,根据你的SQL环境和代码复杂度选择即可:
方法1:直接重复CASE逻辑计算(简单直接)
这种方式不用改动原有查询结构,直接在两个CASE列后新增计算列即可。注意要把字符串类型的SRCC_RATIO转成数值再和Exposure相乘,避免类型错误:
-- 原有SRCC_RATIO计算逻辑 CASE WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.10 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 0.25 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.25 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 0.5 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.5 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 1.0 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 1.0 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 2.5 THEN '0.75' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 2.5 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 5.0 THEN '0.5' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 5.0 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 10.0 THEN '0.25' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 5.0 THEN '0.0' ELSE '1.0' end as SRCC_RATIO, -- 原有Exposure计算逻辑 CASE WHEN la.attachmentpoint >= la.occtotallimit THEN la.occtotallimit*la.occparticipation ELSE (la.occtotallimit-la.attachmentpoint)*(la.occparticipation) end as Exposure, -- 新增的乘积计算列 CAST( CASE WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.10 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 0.25 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.25 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 0.5 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.5 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 1.0 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 1.0 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 2.5 THEN '0.75' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 2.5 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 5.0 THEN '0.5' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 5.0 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 10.0 THEN '0.25' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 5.0 THEN '0.0' ELSE '1.0' end AS DECIMAL(5,2) ) * CASE WHEN la.attachmentpoint >= la.occtotallimit THEN la.occtotallimit*la.occparticipation ELSE (la.occtotallimit-la.attachmentpoint)*(la.occparticipation) end AS Calculated_Product
方法2:用CTE/子查询简化逻辑(更易维护)
如果不想重复写两遍CASE逻辑,可以先通过CTE或子查询算出SRCC_RATIO和Exposure,再在外层计算乘积,代码可读性更强:
WITH BaseCalculations AS ( SELECT -- 保留原有查询的其他字段 CASE WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.10 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 0.25 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.25 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 0.5 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.5 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 1.0 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 1.0 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 2.5 THEN '0.75' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 2.5 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 5.0 THEN '0.5' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 5.0 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 10.0 THEN '0.25' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 5.0 THEN '0.0' ELSE '1.0' end as SRCC_RATIO, CASE WHEN la.attachmentpoint >= la.occtotallimit THEN la.occtotallimit*la.occparticipation ELSE (la.occtotallimit-la.attachmentpoint)*(la.occparticipation) end as Exposure FROM 你的主表名 la JOIN 关联表名 l ON la.关联字段 = l.关联字段 -- 保留原有查询的GROUP BY、WHERE等语句 ) SELECT *, CAST(SRCC_RATIO AS DECIMAL(5,2)) * Exposure AS Calculated_Product FROM BaseCalculations;
方法3:用CROSS APPLY(适合SQL Server等支持的数据库)
如果你的数据库支持CROSS APPLY,可以用它定义两个计算列,之后直接引用计算乘积,代码最简洁:
SELECT -- 保留原有查询的其他字段 calc.SRCC_RATIO, calc.Exposure, CAST(calc.SRCC_RATIO AS DECIMAL(5,2)) * calc.Exposure AS Calculated_Product FROM 你的主表名 la JOIN 关联表名 l ON la.关联字段 = l.关联字段 CROSS APPLY ( SELECT CASE WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.10 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 0.25 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.25 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 0.5 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 0.5 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 1.0 THEN '1.0' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 1.0 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 2.5 THEN '0.75' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 2.5 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 5.0 THEN '0.5' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 5.0 AND ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 < 10.0 THEN '0.25' WHEN ((la.occtotallimit + la.attachmentpoint)/2)/NULLIF(SUM(l.replacementvaluea+l.replacementvalueb+l.replacementvaluec+l.replacementvalued),0)*100 > 5.0 THEN '0.0' ELSE '1.0' end as SRCC_RATIO, CASE WHEN la.attachmentpoint >= la.occtotallimit THEN la.occtotallimit*la.occparticipation ELSE (la.occtotallimit-la.attachmentpoint)*(la.occparticipation) end as Exposure ) calc -- 保留原有查询的GROUP BY、WHERE等语句
注意事项
SRCC_RATIO是字符串格式的数值,必须用CAST或CONVERT转成数值类型(比如DECIMAL(5,2))后再相乘,否则会触发类型不兼容错误。- 如果使用MySQL,可以把
CROSS APPLY替换为JOIN (SELECT ...) calc ON 1=1,实现相同效果。
内容的提问来源于stack exchange,提问作者Aaron Wong
相关产品推荐
相关产品推荐

