SUM分析函数应用缺陷及解决办法
基础知识:
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分析函数应用缺陷及解决办法相关推荐
- oracle sum函数返回空,关于SQL语句中SUM函数返回NULL的解决办法
SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...
- JUC04-- CAS自旋 、CAS自旋锁、ABA问题及解决办法、18大原子类
文章目录 JUC04 课程任务概览 CAS CAS原理简介 CAS发展: CAS是什么? CAS原理: CAS优点: **CAS底层实现-引出Unsafe类** ==CAS自旋实现个人总结== Ato ...
- linux下织梦cms安装环境配置文件,Mac本地环境配置以及安装织梦CMS,增加新的坑解决办法...
Mac上其实已经自带了Apache和PHP,只是默认关闭的.开启一下就行了. Apache配置 apache已经自带了,只需在"终端"输入命令开启下就行了. 开启apache ...
- 一些长时间GC停顿问题的排查及解决办法
对于许多企业级应用,尤其是OLTP应用来说,长暂停很可能导致服务超时,而对这些运行在JVM上的应用来说,垃圾回收(GC)可能是长暂停最主要的原因.本文将描述一些可能碰到GC长暂停的不同场景,以及说明我 ...
- hive数据倾斜的解决办法
数据倾斜是进行大数据计算时常见的问题.主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致. 在hive中遇到数据倾 ...
- oracle 增加ora容量_oracle数据库报错:ORA-01653无法在表空间扩展解决办法 ,增加表空间或表空间增加数据文件...
当Oracle数据库的数据量越来越大,表空间的大小不够用的时候,会报错:"ORA-01653 ", 即表空间满了,无法在表空间扩展解决办法 ,增加表空间或表空间增加数据文件.在这里 ...
- 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 ...
- 谷歌浏览器 自动保存数据后input的黄色背景 解决办法
造成黄色背景的问题在于这里: 解决办法:1.如果需求可以不记录数据的情况下可以禁用input的自动补全,即<input type="text" autocomplete=& ...
- mysql json坑_使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建 ...
最新文章
- 解决AndroidStudio2.0导入eclipse项目时卡死的问题
- react-native 签名
- Python文件操作IO open 读-取-写
- php背景,php图片背景填充实例
- gel和react哪个厉害_gel、react、boost三种材料的跑鞋,哪个更强?
- 详测 Generics Collections TQueue (3): OnNotify、Extract
- Teams的MessageExtension最新功能:Initiate actions
- java题-java运行时异常与一般异常有何异同?
- 我们应该如何(以及为什么)要将Typescript与Express、nodejs一起使用(译文)
- 亲密关系-【认知情绪】-每一次生气的背后有什么
- create-react-app 支持多入口
- visio连接线设置
- Mocha Pro 2022 Plugins for mac(达芬奇/Fusion/Nuke/OFX插件)
- rational rose 启动选择_Rational Rose 附使用教程
- 你真的搞懂Class,class了么?
- 如何打造团队的代码风格统一以及开发效率的提升
- Excel中插入图表后在设计选项卡无法选择样式解决办法
- 步进电机应用c语言程序设计实例,51单片机调节步进电机应用C语言程序设计
- 【论文阅读】Underwater Image Enhancement: Using Wavelength Compensation and Image Dehazing(WCID)
- ubuntu 16.04 LTS 安装搜狗拼音输入法步骤详解
热门文章
- android 监听多个广播,同一个广播接收器监听多个广播及多个广播接收器监听同一个广播...
- Alpha冲刺——事后诸葛亮
- 2020年6月TIOBE编程语言排名公布
- 影响因子,计算机科学,影响因子最高计算机科学期刊(前50种).doc
- 通过PS把普通数码照片制作成素描照片
- linux 解决wps文档显示异常问题
- css 字体样式设置大全
- iphone有关QQ和微信无法收到推送通知的终极解决方案
- flex 分类模块布局 (双排盒子布局 等比例 等间距)Vue绑定数据
- 中文分词与去除停用词