【问题标题】:dynamically joining tables of different counts SAS动态连接不同计数SAS的表
【发布时间】:2018-03-16 01:24:37
【问题描述】:

我正在使用 sas sql。

我有一个脚本,它总是根据时间间隔生成不同数量的表。对于每一天的一张表,除了列余额之外,列的名称都是相同的。此列名称包含日期。表的名称是 TableName_date,如 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

是否可以创建一个自动连接这些表的脚本?它们应该是这样的

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)

【问题讨论】:

  • 您应该发布到目前为止您尝试过的代码。只需将 MT、column、RT 和 AREA 上的表合并在一起,这似乎是一项简单的任务。我很想创建一个视图而不是一个表,只是为了避免重复数据存储。
  • "是否可以创建一个脚本来自动连接这些表?"是的。请确保您的问题实际上是您想要回答的问题,即如何创建一个脚本来连接这些表?我也不确定“自动”部分的位置。
  • 例如我只显示了2个表,但是脚本生成了两个以上的表,每次脚本运行时,表的数量都会不同...我有任何代码,因为我不知道,如何编写动态连接...我第一种情况我得到 3 个表,第二种情况我得到 4 个表,第三种情况我得到 10 个表...
  • 您尚未在此处发布您尝试过的内容。下面有一个解决方案的建议。如果您需要示例代码,请将您的数据作为数据步骤发布,并展示您尝试解决此问题的方法。
  • 我添加了一个创建表格的代码

标签: sql dynamic sas jointable


【解决方案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; 

【讨论】:

  • 感谢您的回答,但我需要在表格中的每一天间隔新列。如果间隔包含 5 天,则该表将包含每天 10 列的余额。没有一个余额列包含所有日期的总值。
  • 这就是添加日期变量作为组变量之一的作用。它对每一天进行单独的观察。如果您想制作一个报告,其中旋转为列,请在 proc 报告中使用跨变量。或者使用 proc transpose 制作一个包含多列的报表。
【解决方案2】:

首先不要这样做,请将您的数据保存为长格式。保持数据较长,意味着您的表结构不会不断变化。您的报告结构可能会发生变化 - 但如果数据保持较长时间,从数据库的角度来看会更容易。宽格式也违反了“整洁数据”的原则。

附加表并将 balance_date 重命名为 balance,或者在所有数据集中都相同的名称。

如果您想要报告的宽表格,请使用 PROC REPORT。如果您真的,真的,真的(并且您不应该)想要以宽格式存储它,那么您可以在使用带有 ID 和/或 IDLABEL 的 PROC TRANSPOSE 来创建相同的结构之后对其进行转置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多