在SAS(PROC SQL)中创建串联摘要数据

时间:2018-08-20 15:07:51

标签: sql sas db2

我有一个SAS数据集(change_detail),该数据集维护着更改变量并且看起来像这样(除了实际表中有200多个更改变量):

Reference Chg1Code Chg1Desc Chg2Code Chg2Desc Chg3Code Chg3Desc
--------- -------- -------- -------- -------- -------- --------
1234                        C        Change2
1234      C        Change1  C        Change2
1234      C        Change1                    C        Change3
2345      C        Change1                    C        Change3
2345                                          C        Change3
3456                        C        Change2  C        Change3
3456      C        Change1  C        Change2
3456      C        Change1
3456      C        Change1                    C        Change3  

我需要将此信息提取为每个参考编号发生的更改的摘要。当我在SAS中使用以下PROC SQL时:

proc sql;
create table work.changedata_summary as 
select distinct 
      a.Reference, 
      catx(',',a.Chg1Desc,a.Chg2Desc,a.Chg3Desc) as Changes length=1000
from
      work.change_detail a
;
quit;

它串联了各个“变更描述”变量,但保留了每个“参考编号”的原始观察值数量。我得到的结果是:

Reference Changes
--------- -------
1234      Change2
1234      Change1,Change2
1234      Change1,Change3
2345      Change1,Change3
2345      Change3
3456      Change2,Change3
3456      Change1,Change2
3456      Change1
3456      Change1,Change3

在整理数据方面(使用PROC SQL或DATA步骤)时,我需要一些帮助,以按不同的参考号仅显示摘要结果。预期结果是:

Reference Changes
--------- -----------------------
1234      Change1,Change2,Change3
2345      Change1,Change3
3456      Change1,Change2,Change3

任何提供的帮助将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:0)

如果您的数据是这样的,则可以在代码中添加group by和max,应该可以

  proc sql;
  create table work.changedata_summary as 
  select  
        Reference, 
  catx(',',max(chg1Desc),max(Chg2Desc), max(Chg3Desc)) as Changes length=1000
  from
  have 
  group by Reference
  ;
  quit;

答案 1 :(得分:0)

我什至不会尝试在PROC SQL中做这样的事情。如果您只想查看每个变量的最后一个非空更改,则可以使用带有UPDATE语句的数据步骤将数据折叠为每个组一个观察值。

data want ;
  update have (obs=0) have ;
  by reference ;
  length changes $500 ;
  changes=catx(',',of change1-change3);
run;

答案 2 :(得分:0)

我将使用“数据”步骤进行此类操作

尝试一下

data want;

length change_tot $200.;

   do until (last.Reference);

      set have;

        by Reference notsorted;

      change_tot=catx(',',change_tot,Chg1Desc, Chg2Desc, Chg3Desc);

   end;

   Keep reference change_tot;

run;