2017-10-04 52 views
-1

即时通讯工作在sql中。动态加入不同计数的表格SAS

我有一个脚本,总是根据时间间隔生成不同数量的表。对于每一天的一个表格,列名称除列平衡外均相同。此列名称包含日期。表的名称是像TableName_07092017 ... TableName_31092017

MT   column  RT AREA balance_07092017 
ACCOUNTS balance_lcy 30  2004862772 
ACCOUNTS balance_lcy 30 CA 121390255,8 
ACCOUNTS balance_lcy 30 GL 323499587 
ACCOUNTS balance_lcy 30 TF -7821721555 
C_ACCOUNTS balance_lcy 35 CA 2,49733E+11 
C_ACCOUNTS balance_lcy 35 NO 3748192715 


MT   column  RT AREA balance_08092017 
ACCOUNTS balance_lcy 30  -24278162321  
ACCOUNTS balance_lcy 30 CA 225363070.05  
ACCOUNTS balance_lcy 30 GL 3117815863.7 
ACCOUNTS balance_lcy 30 TF 47914289803 
C_ACCOUNTS balance_lcy 35 CA 37637391174 
C_ACCOUNTS balance_lcy 35 NO 163722935.2 

TableName_date是否有可能创建一个脚本,将自动加入这些表?他们应该像这样

MT   column  RT AREA balance_07092017 balance_08092017 balance_09092017 balance_10092017.... 
ACCOUNTS balance_lcy 30  2004862772  -24278162321 
ACCOUNTS balance_lcy 30 CA 121390255,8  225363070.05 
ACCOUNTS balance_lcy 30 GL 323499587   3117815863.7 
ACCOUNTS balance_lcy 30 TF -7821721555  47914289803 
C_ACCOUNTS balance_lcy 35 CA 2,49733E+11  37637391174 
C_ACCOUNTS balance_lcy 35 NO 3748192715  163722935.2 

这里是一个创建,我需要参加

%macro sqlloop(start,end); 
    PROC SQL; 
    %DO DT_REP=&start. %TO &end.; 

     %let year=%sysfunc(year(&DT_REP.)); 
     %let month=%sysfunc(month(&DT_REP.)); 
     %let month1=%sysfunc(PUTN(&month.,z2.)); 
     %let day=%sysfunc(day(&DT_REP.)); 
     %let day1=%sysfunc(PUTN(&day.,z2.)); 
     %let datum= &day1.&month1.&year.; 
     %put &datum.; 

     CREATE TABLE DUPLICITY_BAL_&datum. as 
     select 'ACCOUNTS' as MT, 'balance_lcy' as column, rec_type, area, sum(balance_lcy) as balance_lcy, count(balance_lcy) as count 
     from database.ACCOUNTS 
     where version_no = 1 
      and dt_rep = &DT_REP. 
     group by rec_type, area 

     union all 
     select 'C_ACCOUNTS' as MT, 'balance_lcy' as column, rec_type, area, sum(balance_lcy) as balance_lcy, count(balance_lcy) as count 
     from database.C_ACCOUNTS 
     where version_no = 1 
      and dt_rep = &DT_REP. 
     group by rec_type, area; 
    %END; 
    QUIT; 
%mend; 

%sqlloop(start=21070, end=21073) 
+3

你应该发布你到目前为止尝试过的代码。这似乎是一个简单的任务,只需将表格合并在MT,列,RT和AREA上即可。我很想创建一个视图而不是表格,只是为了避免重复数据存储。 – Longfish

+1

“是否可以创建一个可以自动连接这些表的脚本?”是的。请确定你的问题实际上是你想要回答的问题,即如何创建一个可以加入这些表格的脚本?我不确定'自动'部分在哪里。 – Reeza

+0

我只展示了2个表格,但脚本生成了两个以上的表格,每次脚本运行时,表格的数量都会不同... 我有任何代码,因为我不知道,如何编写dynamicaly加入... 我第一个案例我得到3个表格,第二个我得到4个表格,第三个我得到10个表格...... – Keliimek

回答

1

为什么你会使用SQL呢?使用SAS代码合并多个数据集非常简单。如果要合并以TableName_开头的所有数据集,请使用:通配符来避免输入单个数据集名称。

data want ; 
    merge TableName_: ; 
    by MT column RT AREA ; 
run; 

为什么要将数据拆分为多个表以开始?为什么不一次性生成所有日期?

%macro sqlloop(start,end); 
PROC SQL; 
    CREATE TABLE DUPLICITY_BAL as 
    select 'ACCOUNTS' as MT 
     , 'balance_lcy' as column 
     , dt_rep 
     , rec_type 
     , area 
     , sum(balance_lcy) as balance_lcy 
     , count(balance_lcy) as count 
    from database.ACCOUNTS 
    where version_no = 1 
     and dt_rep between &start and &end 
    group by 1,2,3,4,5 

    union all 
    select 'C_ACCOUNTS' as MT 
     , 'balance_lcy' as column 
     , dt_rep 
     , rec_type 
     , area 
     , sum(balance_lcy) as balance_lcy 
     , count(balance_lcy) as count 
    from database.C_ACCOUNTS 
    where version_no = 1 
     and dt_rep between &start and &end 
    group by 1,2,3,4,5 
    ; 
quit; 
%mend sqlloop; 
+0

感谢您的回答, 但我需要每隔一段时间间隔在表格中添加新列。如果间隔包含5天,则该表格将包含每天的10列余额。没有一个平衡列和所有日子的总价值在一起。 – Keliimek

+1

这就是添加日期变量作为组变量之一。它为每一天做了一个独立的观察。如果您希望将那些旋转为列的报告用于proc报告中的跨变量。或者使用proc转置来创建一个用于多列报表的表格。 – Tom

0

不要摆在首位做到这一点,让你的数据在一个长格式表的代码。长时间保持数据,意味着您的表格结构不会不断变化。您的报告结构可能会发生变化 - 但是如果数据保持很长时间,则从数据库角度来看更容易。广泛的格式也违反了“整洁数据”的原则。

附加表格并将balance_date重命名为天平,或者是所有数据集中相同的东西。

如果您希望广泛的报告形式使用PROC REPORT。如果你确实真的(而且你也不应该)想以宽格式存储它,那么你可以在使用带有ID和/或IDLABEL的PROC TRANSPOSE之后转置它,以创建相同的结构。