楼主: iittala
2775 4

请问如何用SAS计算一个时期内每天的数据并放入一张表内? [推广有奖]

  • 0关注
  • 0粉丝

大专生

11%

还不是VIP/贵宾

-

威望
0
论坛币
1845 个
通用积分
0.0600
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
432 点
帖子
30
精华
0
在线时间
23 小时
注册时间
2013-5-16
最后登录
2021-9-12

楼主
iittala 发表于 2014-5-19 09:11:58 |AI写论文
100论坛币
下面这段,是算一天的变量r1和add_r的(就是%let date_str=的那一天)。我想算一个时间段内每天的r1和add_r,并把这两个数据统计在一张表上,请问该怎么做啊?另外日期不要周末的。

*%let date_str = '20140312';
proc sql;
  connect to oracle as conname  (&risk);  
  create table hthg as select * from connection to conname   
(
select bizdate,a.code,a.name,close_price,bizdate2,close_price2,close_price/close_price2-1 as r,
       to_date(bizdate,'yyyy-mm-dd')-to_date(bizdate2,'yyyy-mm-dd') as interval      from
(select bizdate,code,name,close_price
  from pf_all_quotation
where typecode = 'S'
   and code in
       ('s3756108','h11009')
   and bizdate = &date_str ) a
   
left join (   
select bizdate as bizdate2,code,name,close_price as close_price2
  from pf_all_quotation
where typecode = 'S'
   and code in   ('s3756108','h11009')
   and bizdate = 20140311  ) b  on a.code=b.code
);
  disconnect from conname;
quit;
%let a='R0000056';   
data hthg2;
set hthg;
if code='s3756108' then
  do;
  r1=0.5*r;
  p=&a;         
  end;
if code='h11009' then
  do;
  r1=0.5*r;
  p=&a;
  end;
run;
proc sql;
create table hthg3 as
( select sum(r1)as r,p,bizdate
  from hthg2
  where p=&a
  group by p,bizdate
  );
quit;


proc sql;
  connect to oracle as conname  (&risk);  
  create table jingzhi_hthg as select * from connection to conname   
(
     select c.*,b2,nav2,add2 from
   (select a.painnercode as p, panamecn, bizdate, nav, addupnav as add1
     from pd_real_pa_netval a
     left join pd_pa_definition b on a.painnercode = b.painnercode
    where bizdate = &date_str
     and a.painnercode ='R0000056' ) c
    left join     
       ( select painnercode as p,bizdate as b2, nav as nav2, addupnav as add2
     from  pd_real_pa_netval
     
    where bizdate = 20140311
     and painnercode ='R0000056' ) d  on c.p=d.p
);
  disconnect from conname;
quit;
data jingzhi_hthg;
set jingzhi_hthg;
add_r=(add1-add2)/nav2;      * 修正复权净值增长率;
drop b2 nav2 add2;
run;
data pf_all_bench17;      * 业绩基准表  03.11运作;
merge jingzhi_hthg  hthg3;
by p;

最佳答案

jeozu 查看完整内容

试一下这段代码, 全部都在Oracle中解决的。
关键词:如何用 connection Disconnect definition left join oracle create 时间段 如何 统计

沙发
jeozu 发表于 2014-5-19 09:11:59
iittala 发表于 2014-5-19 17:42
嗯,就要p, panamecn, bizdate, nav, add1, add_r, r这几项。你看我这代码是用来计算3月12号(date_str ...
试一下这段代码, 全部都在Oracle中解决的。
  1. proc sql;
  2.   connect to oracle as conname  (&risk);  
  3.   create table final as select * from connection to conname   
  4. (
  5. select
  6.        bb.painnercode   as p
  7.      , bb.panamecn      as panamecn
  8.      , aa.bizdate       as bizdate
  9.      , bb.nav           as nav
  10.      , bb.add1          as add1
  11.      , bb.add_r         as add_r
  12.      , aa.r             as r
  13.      , bb.bizdate2      as bizdate2
  14. from (
  15.       select bizdate
  16.            , sum(r1)  as r
  17.       from (
  18.            select a.bizdate
  19.                 , a.code
  20.                 , case a.code
  21.                        when 's3756108' then (a.close_price/b.close_price-1)*0.5
  22.                        when 'h11009'   then (a.close_price/b.close_price-1)*0.5
  23.                        else NULL
  24.                   end  as r1

  25.                 , a.name
  26.                 , to_date(a.bizdate,'yyyy-mm-dd')-to_date(b.bizdate,'yyyy-mm-dd') as interval      
  27.            from (
  28.                   select bizdate
  29.                        , code
  30.                        , name
  31.                        , close_price
  32.                     from pf_all_quotation
  33.                    where typecode = 'S'
  34.                      and code in ('s3756108','h11009')
  35.                      and bizdate = &date_str
  36.                  ) a
  37.            left join (   
  38.                        select bizdate
  39.                             , code
  40.                             , close_price
  41.                          from pf_all_quotation
  42.                         where typecode = 'S'
  43.                           and code in  ('s3756108','h11009')
  44.                      ) b  
  45.            on a.code=b.code
  46.           and b.bizdate = case when to_char(to_date(a.bizdate,'yyyy-mm-dd'),'d') = '2' then to_date(a.bizdate, 'yyyy-mm-dd')-3
  47.                              else to_date(a.bizdate,'yyyy-mm-dd')-1  
  48.                           end   /* if bizdate is monday, then the base is the previous Friday */
  49.            )
  50.       group by 1
  51. ) aa
  52. inner join
  53.      (
  54.       select c.painnercode                   as painnercode
  55.            , c.panamecn                      as panamecn
  56.            , c.bizdate                       as bizdate
  57.            , c.nav                           as nav
  58.            , c.addupnav                      as add1
  59.            , (c.addupnav-d.addupnav)/d.nav   as add_r
  60.            , d.bizdate                       as bizdate2
  61.       from (
  62.              select a.bizdate
  63.                   , a.painnercode
  64.                   , panamecn
  65.                   , nav
  66.                   , addupnav
  67.                from pd_real_pa_netval a
  68.                left join pd_pa_definition b
  69.                  on a.painnercode = b.painnercode
  70.               where a.painnercode ='R0000056'
  71.            ) c
  72.       left join (
  73.                    select bizdate
  74.                         , painnercode
  75.                         , nav
  76.                         , addupnav
  77.                      from pd_real_pa_netval
  78.                     where painnercode ='R0000056'
  79.                  ) d  
  80.       on c.painnercode=d.painnercode
  81.      and d.bizdate = case when to_char(to_date(c.bizdate,'yyyy-mm-dd'),'d') = '2' then to_date(c.bizdate, 'yyyy-mm-dd')-3
  82.                         else to_date(c.bizdate,'yyyy-mm-dd')-1  
  83.                      end   /* if bizdate is monday, then the base is the previous Friday */
  84.      ) bb
  85. on aa.bizdate=bb.bizdate
  86. );
  87. disconnect from conname;
  88. quit;
复制代码

藤椅
jeozu 发表于 2014-5-19 16:20:51
你现在的代码跟以前的那个SQL差距太大~~结果应该完全不一样~~你确定要这个??
最终表只需要code, name, bizdate,bizdate2, close_price, close_price2, r, addr, painnercode, panamecn, nav, nav2, add1, add2, add_r ????

板凳
iittala 发表于 2014-5-19 17:42:27
jeozu 发表于 2014-5-19 16:20
你现在的代码跟以前的那个SQL差距太大~~结果应该完全不一样~~你确定要这个??
最终表只需要code, nam ...
嗯,就要p, panamecn, bizdate, nav, add1, add_r, r这几项。你看我这代码是用来计算3月12号(date_str)的数据的,是要和3月11号(bizdate)的数据相比的。我现在就想算date_str=20140313, bizdate=20140312然后date_str=20140314, bizdate=20140313这么以此类推下去,直到今天的。把每天的数据都列在一张表上,然后周末不要,就和下图一样。多谢大神回答!

image.jpeg

报纸
jeozu 发表于 2014-5-19 20:24:48
iittala 发表于 2014-5-19 17:42
嗯,就要p, panamecn, bizdate, nav, add1, add_r, r这几项。你看我这代码是用来计算3月12号(date_str ...
那你的意思是做滚动增量??addr, r1都是跟上一个交易日环比的增长率?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 04:14