mysql窗口函数同比环比_sas使用proc report实现同比 环比 占比。顺带实现了sql的窗口函数...

使用sas实现同比 环比 占比,其中环比和占比是使用proc report实现的,环比使用data步实现,但是其中每年的总计是使用proc report来实现的。

proc report 可以实现proc print proc tabluate proc sort proc means 以及data步的一些功能,所以有中想法,把proc report当做是进行复杂统计的实现方法之一,比如sql中的开窗函数就可以用proc report实现。

以下是具体的代码和数据。

转载请注明出处:http://www.cnblogs.com/SSSR/p/6904636.html

代码参考自:Using PROC REPORT To Produce Tables With Cumulative Totals and Row Differences

更新--20170525 20:10

总结:report的compute步中是先一列一列的计算,新增列的时候可以用前面列的数据,跟在data步中新建列感觉区别不大,可以使用data步中的函数。

最后的BREAK AFTER year / SUMMARIZE SKIP OL UL ;这里只能是summarize求和,不能是其他的。

想着测试一下data步中的lag函数在report的compute中是否可以使用,没想到呀!居然可以直接求出来同比,大赞,记录下。

DATA quarter;

DO year=97 TO 99;

DO j=1 TO 12;

IF j=1 THEN xx='1dec1997'd;

QUARTER=QTR( intnx('month',xx,J) );

DO n=1 to 100;

sales=int(normal(123)*(20)+quarter*7);

IF QUARTER=3 THEN SALES=SALES-15;

OUTPUT;

END;

END;

END;

RUN;

PROC FORMAT ;

VALUE PCTA

.='(na)'

OTHER=[PERCENT8.0];

VALUE DOLLARA

.='(na)'

OTHER=[DOLLAR8.0];

RUN;

ods html file='c:/myhtml.htm';

PROC REPORT DATA=QUARTER NOWD OUT=Six

SPLIT="*" CENTER HEADSKIP HEADLINE;

COLUMN

( year quarter )

( sales=salessum pct)

(diff diff_pct pct_tongbi) ;

DEFINE year / GROUP;

DEFINE quarter / GROUP FORMAT=8. CENTER;

DEFINE salessum / ANALYSIS sum FORMAT=DOLLAR8. SUM ;

DEFINE pct / computed FORMAT=PERCENT8.0 ;

DEFINE diff / COMPUTED FORMAT= DOLLAR8.0 ;

DEFINE diff_pct / COMPUTED FORMAT=percent9.0;

define pct_tongbi/computed format=percent9.0;

COMPUTE BEFORE year ;*modify;

r=0;

last=0;

total=salessum;

ENDCOMP;

COMPUTE pct;/*实现了sql的窗口函数*/

pct=salessum/total;

ENDCOMP;

COMPUTE diff ;

r+1;

IF r=1 THEN diff=. ;

else DO;

if _BREAK_ EQ " " THEN

diff=salessum-last ;

else diff = . ;

end;

last = salessum;

ENDCOMP;

COMPUTE diff_pct ;

diff_pct= (diff/(last-diff) );

ENDCOMP;

COMPUTE pct_tongbi;/*计算同比,可以直接使用lag函数,so data步中的很多函数估计就都可以在report中使用了!*/

pct_tongbi=salessum/lag6(salessum)-1;

ENDCOMP;

BREAK AFTER year / SUMMARIZE SKIP OL UL ;

RUN;

ods html close;

以下代码比较复杂,计算同比使用了data步。

DATA quarter;

DO year=97 TO 99;

DO j=1 TO 12;

IF j=1 THEN xx='1dec1997'd;

QUARTER=QTR( intnx('month',xx,J) );

DO n=1 to 100;

sales=int(normal(123)*(20)+quarter*7);

IF QUARTER=3 THEN SALES=SALES-15;

OUTPUT;

END;

END;

END;

RUN;

PROC FORMAT ;

VALUE PCTA

.='(na)'

OTHER=[PERCENT8.0];

VALUE DOLLARA

.='(na)'

OTHER=[DOLLAR8.0];

RUN;

/*这个是实现占比和环比的,生成了一个数据集,all也在这里生成了*/

ods html file='c:/myhtml.htm';

PROC REPORT DATA=QUARTER NOWD OUT=Six

SPLIT="*" CENTER HEADSKIP HEADLINE;

COLUMN

( year quarter )

( sales=salessum pct)

(diff diff_pct) ;

DEFINE year / GROUP;

DEFINE quarter / GROUP FORMAT=8. CENTER;

DEFINE salessum / ANALYSIS sum FORMAT=DOLLAR8. SUM ;

DEFINE pct / computed FORMAT=PERCENT8.0 ;

DEFINE diff / COMPUTED FORMAT= DOLLAR8.0 ;

DEFINE diff_pct / COMPUTED FORMAT=percent9.0;

COMPUTE BEFORE year ;*modify;

r=0;

last=0;

total=salessum;

ENDCOMP;

COMPUTE pct;

pct=salessum/total;

ENDCOMP;

COMPUTE diff ;

r+1;

IF r=1 THEN diff=. ;

else DO;

if _BREAK_ EQ " " THEN

diff=salessum-last ;

else diff = . ;

end;

last = salessum;

ENDCOMP;

COMPUTE diff_pct ;

diff_pct= (diff/(last-diff) );

ENDCOMP;

*BREAK AFTER year / SUMMARIZE SKIP OL UL ;

RUN;

ods html close;

/*对report中生成的数据集进行进一步的加工*/

DATA sixout(keep=year quarterx salessum pct diff_pct);

retain year quarterx salessum pct diff_pct ;

set six;

if quarter=. then quarterx='ALL';

else quarterx=quarter;

if not missing(_break_) then pct=1;

RUN;

/*排序,为下一步求同比做准备*/

proc sort data=sixout out=sixout;

by year quarterx;

run;

/*求同比直接用lag5函数即可,这个大家都知道,*/

/*但是有时候我们会遇到今年和去年的分类数据不同,必去去年一季度有数据,但是今年为0,就不现实了,所以这个时候我们还需要先将所有的分类(季度)数据和年份进行全匹配,缺失的填充为0,然后再进行处理*/

data sixx_result;

set sixout;

*lag5=lag5(salessum);

tongbi=salessum/lag5(salessum)-1;

format tongbi PERCENT8.2 ;

format pct PERCENT8.2 ;

format diff_pct PERCENT8.2 ;

run;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
限时福利1:购课进答疑群专享柳峰(刘运强)老师答疑服务 为什么需要掌握高性能的MySQL实战? 由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准之一。 为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了「高性能 MySQL 知识框架图」,帮你梳理学习重点,建议收藏! 【课程设计】 课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。 一、性能优化篇: 主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。 二、MySQL 8.0新特性篇: 主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。 三、高性能架构篇: 主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。 四、面试篇: 程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值