ERP浅谈之报表SQL简述

时间:2021-07-01 22:18:18
昨天刚刚独立完成了一次月销售增长分析报表,发现了很多问题和方法,觉得很有必要来记录一下.

首先贴一下代码:

/*dialect*/
select Fnumber,FName_l2,sum(NowFQty) NowFQty,sum(LastFQty) LastFQty,sum(NowFAmount) NowFAmount,sum(LastFAmount) LastFAmount,sum(NowFPrice) NowFPrice,sum(LastFPrice) LastFPrice --报表的最外层sql
from (
select --本月数据
tm.Fnumber,tm.FName_l2,sum(t2.FQty) NowFQty,0 LastFQty,sum(t2.FAmount) NowFAmount,0 LastFAmount,sum(t2.FPrice) NowFPrice,0 LastFPrice
from T_BD_Material tm
inner join T_SD_SaleOrderEntry t2 on tm.FID =t2.FMaterialID
inner join T_SD_SaleOrder t1 on t2.FparentID=t1.fid
inner join T_ORG_Sale ts on t1.FSaleOrgUnitID = ts.FID
where
to_char(t1.fbizDate,'yyyy-MM')=substr('2016-12-1',0,7) --对比字符串
and t1.FSaleOrgUnitID='75QAAAAAAEDM567U' --公司判断
group by tm.Fnumber,tm.FName_l2

union all

select –上月数据
tm.Fnumber,tm.FName_l2,0 NowFQty,sum(t2.FQty) LastFQty,0 NowFAmount,sum(t2.FAmount) LastFAmount,0 NowFPrice,sum(t2.FPrice) LastFPrice
from T_BD_Material tm
inner join T_SD_SaleOrderEntry t2 on tm.FID =t2.FMaterialID
inner join T_SD_SaleOrder t1 on t2.FparentID=t1.fid
where
–to_char(t1.fbizDate,’yyyy’)=substr(‘@bizDate’,0,4)
to_char(t1.fbizDate,’yyyy-MM’)=to_char(add_months(to_Date(‘2016-12-1′,’yyyy-MM-dd’),-1),’yyyy-MM’) –对比字符串
and t1.FSaleOrgUnitID = ’75QAAAAAAEDM567U’ –公司判断
group by tm.Fnumber,tm.FName_l2
)
group by Fnumber,Fname_l2

        这次所写的SQL代码跟之前很大的区别是更加的具有规范性.因为未来随着工作的深入,查询条件的复杂,没有一个规范的代码编写格式,对测试和修改有非常不好的影响,甚至自己都会看不懂.
select 查询报表所有需查询数据,在这里使用了连接查询union all,这个方法要求前后的select查询的内容数量和格式要一样,所以当查询到子查询中没有的数据时,用select 0 name 的方法来实现.0代表着下面查询中不存在的值,又其他的子查询来实现的.
from 后面所连接的而所有的表均使用内连接inner join on,分析表中关联关系进行连接,不要使用and 或者”,”,属于不规范范畴.
where中的方法查询要一个方法一行,简单明了.
group by要包含select中所有查询数据,当然sum,max等函数的查询不用加入其中.

       再说一下这次报表中用到的基本sql方法.
substr(string,start,long):这个方法是选取字符串中的一段,start是起始位置,end是截取字段长度.
to_date(string,’格式’):将字符串转换为日期格式.’格式’是规范转换后的样式,如”yyyy-MM-dd”.
to_char(date,”格式”):将日期格式转换成字符格式,格式中可规定转换后的格式,如”yyyy-MM”.
add_months(date,number):对日期中月份的计算方法,number是需要计算的数字,可正可副,对应着加减.

注:在EAS中的字符串可以从参数中获取.如代码中的日期字符串’2016-11-1’就可替换成参数中的’@datefrom’.