Oracle分组查询:每组首行保留MAX_LIMIT其余置0需求实现
修改Oracle查询实现分组内仅首行保留MAX_LIMIT值
修改后的查询语句
SELECT a.SRNO, a.srno_dtl, a.REPORT_HEAD_NAME, a.current_gl_srno, a.Fixed_gl_srno, NVL((SELECT SUM(NVL(C.CURBAL,0)) FROM GLMAS C WHERE C.BRANCH_CODE='2' AND C.ACC_CODE=a.CURRENT_GL_SRNO AND C.DATE_OP <='04-Sep-2017' AND (C.DATE_CL IS NULL OR C.DATE_CL > '04-Sep-2017')),0) AS MIN_LIMIT, -- 核心修改:仅srno_dtl=1时保留原MAX_LIMIT值,其余行置为0 CASE WHEN a.srno_dtl = 1 THEN NVL((SELECT SUM(NVL(C.CURBAL,0)) FROM GLMAS C WHERE C.BRANCH_CODE='2' AND C.ACC_CODE=a.FIXED_GL_SRNO AND C.DATE_OP <='04-Sep-2017' AND (C.DATE_CL IS NULL OR C.DATE_CL > '04-Sep-2017')),0) ELSE 0 END AS MAX_LIMIT FROM INTER_BANK_EXP_HEAD a ORDER BY a.SRNO,a.srno_dtl;
实现思路
- 基础条件判断:利用现有
srno_dtl字段的特性(每个SRNO分组内首行的srno_dtl值为1),通过CASE语句做分支处理:首行保留原本计算的MAX_LIMIT结果,其他行直接返回0。 - 灵活优化方案:如果后续
srno_dtl的编号规则发生变化(比如不是从1开始连续编号),可以改用ROW_NUMBER()窗口函数来精准定位分组内的首行,替换CASE条件为:
这种方式不依赖CASE WHEN ROW_NUMBER() OVER(PARTITION BY a.SRNO ORDER BY a.srno_dtl) = 1 THEN -- 原MAX_LIMIT子查询内容 ELSE 0 END AS MAX_LIMITsrno_dtl的具体数值,仅按排序后的首行判断,适用性更强。
执行上述查询后,就能得到你期望的结果:每个SRNO分组仅首行保留原MAX_LIMIT值,其余行MAX_LIMIT置为0。
内容的提问来源于stack exchange,提问作者krunal shah
相关产品推荐
相关产品推荐

