基础知识:

SUM函数结合窗口函数over用于聚合某一分区内的数据,可根据窗口滑动的范围来确定是记总,还是在分区中从某行累计到某行:

ROWS BETWEEN unbounded preceding AND current row  是指第一行至当前行的汇总

ROWS BETWEEN current row AND unbounded following  是指当前行到最后一行的汇总

ROWS BETWEEN 1 preceding AND current row 是指当前行的上一行(rownum-1)到当前行的汇总

ROWS BETWEEN 1 preceding AND 1 following  是指当前行的上一行(rownum-1)到当前行的下两行(rownum+2)的汇总

应用:

在求科目余额累计数的时候,每个月的科目不是固定的,当sum函数以年,公司,科目分区时,查询5月某个科目的数据时,分析函数字段应当是从1月到5月该科目的累计数,即使表中5月不存在该科目,5月也应当存在一条从1月到4月的sum字段的累计数。目前发现sum是做不到这样的操作。

解决方案:

写查询片段,不以over函数去sum每月科目的数据后,将月份写死为查询月。这种片段需要写12个(排除特殊期间)。

with cc as (select * from (select v.unitcode,v.unitname,v.yearV,v.subjcode,v.subjname,v.subjlev,v.ts,v.periodv,v.creditamount,v.debitamount,sum(v.creditamount* -1 + v.debitamount) balancefrom  ODS.Odsreyy_V_Gl_Balance@FMSLK vwhere periodv <> '00'group by v.unitcode,v.unitname,v.yearV,v.subjcode,v.subjname,v.subjlev,v.ts,v.periodv,v.creditamount,v.debitamount)union all select * from (select v.unitcode,v.unitname,v.yearV,v.subjcode,v.subjname,v.subjlev,v.ts,v.periodv,0 creditamoun,0 debitamount,sum(v.creditamount* -1 + v.debitamount) balancefrom  ODS.Odsreyy_V_Gl_Balance@FMSLK vwhere periodv = '00'group by unitcode,unitname,yearV,subjcode,subjname,subjlev,ts,periodv)
),
s1 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'01' periodv,creditamount ,debitamount, balancefrom  cc where   periodv <= '01')group by unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv
),
s2 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'02' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '02')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s3 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'03' periodv,creditamount ,debitamount, balancefrom  cc where   periodv <= '03')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s4 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'04' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '04')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
)
,
s5 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'05' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '05')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s6 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'06' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '06')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s7 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'07' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '07')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s8 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'08' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '08')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s9 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'09' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '09')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s10 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'10' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '10')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s11 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'11' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '11')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
),
s12 as (select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,sum(creditamount) creditamount  ,sum(debitamount) debitamount,sum(balance) balancefrom ( select unitcode ,unitname,subjcode,subjname,subjlev,yearv,'12' periodv,creditamount ,debitamount, balancefrom  cc where  periodv <= '12')group by unitcode,unitname,yearV,subjcode,subjname,subjlev,periodv
)SELECT YEARMONTH,unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,SHamount,SHMARK,balance,'YONYOU' CLIENTFROM(SELECT YEARMONTH, M.ELEDIM_OUTPUT1 unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,SHamount,SHMARK,balance FROM (select  yearv||periodv YEARMONTH,unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,creditamount*-1 SHamount,'H' SHMARK,balancefrom(select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,creditamount ,debitamount,balancefrom (select * from s1union all select * from s2union all select * from s3union all select * from s4union all select * from s5union all select * from s6union all select * from s7union all select * from s8union all select * from s9union all select * from s10union all select * from s11union all select * from s12)order by subjcode , periodv)union allselect  yearv||periodv YEARMONTH, unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,debitamount SHamount,'S' SHMARK,balancefrom(select unitcode ,unitname,subjcode,subjname,subjlev,yearv,periodv,creditamount ,debitamount,0  balancefrom (select * from s1union all select * from s2union all select * from s3union all select * from s4union all select * from s5union all select * from s6union all select * from s7union all select * from s8union all select * from s9union all select * from s10union all select * from s11union all select * from s12)order by subjcode , periodv)) SLEFT JOIN MAP_REGOLA_TAB_ELEMENTO M ON M.COD_REGOLA_TAB = 'MAP_BUKRS_YONYOU' AND M.COD_MAPPATURA = 'HI_DATA_GL' AND M.ELEDIM_INPUT2 = S.unitcode
)where unitcode is not null  AND YEARMONTH IN ({IN-YEARMONTH}) AND UNITCODE IN ({IN-ENTITY})order by subjcode

SUM分析函数应用缺陷及解决办法相关推荐

  1. oracle sum函数返回空,关于SQL语句中SUM函数返回NULL的解决办法

    SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...

  2. JUC04-- CAS自旋 、CAS自旋锁、ABA问题及解决办法、18大原子类

    文章目录 JUC04 课程任务概览 CAS CAS原理简介 CAS发展: CAS是什么? CAS原理: CAS优点: **CAS底层实现-引出Unsafe类** ==CAS自旋实现个人总结== Ato ...

  3. linux下织梦cms安装环境配置文件,Mac本地环境配置以及安装织梦CMS,增加新的坑解决办法...

    Mac上其实已经自带了Apache和PHP,只是默认关闭的.开启一下就行了. Apache配置 apache已经自带了,只需在"终端"输入命令开启下就行了. ​​​开启apache ...

  4. 一些长时间GC停顿问题的排查及解决办法

    对于许多企业级应用,尤其是OLTP应用来说,长暂停很可能导致服务超时,而对这些运行在JVM上的应用来说,垃圾回收(GC)可能是长暂停最主要的原因.本文将描述一些可能碰到GC长暂停的不同场景,以及说明我 ...

  5. hive数据倾斜的解决办法

    数据倾斜是进行大数据计算时常见的问题.主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致. 在hive中遇到数据倾 ...

  6. oracle 增加ora容量_oracle数据库报错:ORA-01653无法在表空间扩展解决办法 ,增加表空间或表空间增加数据文件...

    当Oracle数据库的数据量越来越大,表空间的大小不够用的时候,会报错:"ORA-01653 ", 即表空间满了,无法在表空间扩展解决办法 ,增加表空间或表空间增加数据文件.在这里 ...

  7. UnboundLocalError: local variable ‘XXX‘ referenced before assignment解决办法

    一.举例: 计算a到10的和 sum=0 def func(a):while a<=10:sum+=aa+=1return sum print(func(9)) 运行结果: UnboundLoc ...

  8. 谷歌浏览器 自动保存数据后input的黄色背景 解决办法

    造成黄色背景的问题在于这里: 解决办法:1.如果需求可以不记录数据的情况下可以禁用input的自动补全,即<input type="text"  autocomplete=& ...

  9. mysql json坑_使用mysql innodb 使用5.7的json类型遇到的坑和解决办法

    ---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建 ...

最新文章

  1. 解决AndroidStudio2.0导入eclipse项目时卡死的问题
  2. react-native 签名
  3. Python文件操作IO open 读-取-写
  4. php背景,php图片背景填充实例
  5. gel和react哪个厉害_gel、react、boost三种材料的跑鞋,哪个更强?
  6. 详测 Generics Collections TQueue (3): OnNotify、Extract
  7. Teams的MessageExtension最新功能:Initiate actions
  8. java题-java运行时异常与一般异常有何异同?
  9. 我们应该如何(以及为什么)要将Typescript与Express、nodejs一起使用(译文)
  10. 亲密关系-【认知情绪】-每一次生气的背后有什么
  11. create-react-app 支持多入口
  12. visio连接线设置
  13. Mocha Pro 2022 Plugins for mac(达芬奇/Fusion/Nuke/OFX插件)
  14. rational rose 启动选择_Rational Rose 附使用教程
  15. 你真的搞懂Class,class了么?
  16. 如何打造团队的代码风格统一以及开发效率的提升
  17. Excel中插入图表后在设计选项卡无法选择样式解决办法
  18. 步进电机应用c语言程序设计实例,51单片机调节步进电机应用C语言程序设计
  19. 【论文阅读】Underwater Image Enhancement: Using Wavelength Compensation and Image Dehazing(WCID)
  20. ubuntu 16.04 LTS 安装搜狗拼音输入法步骤详解

热门文章

  1. android 监听多个广播,同一个广播接收器监听多个广播及多个广播接收器监听同一个广播...
  2. Alpha冲刺——事后诸葛亮
  3. 2020年6月TIOBE编程语言排名公布
  4. 影响因子,计算机科学,影响因子最高计算机科学期刊(前50种).doc
  5. 通过PS把普通数码照片制作成素描照片
  6. linux 解决wps文档显示异常问题
  7. css 字体样式设置大全
  8. iphone有关QQ和微信无法收到推送通知的终极解决方案
  9. flex 分类模块布局 (双排盒子布局 等比例 等间距)Vue绑定数据
  10. 中文分词与去除停用词