【问题标题】:Stacking multiple tables with different structure into one table using proc sql使用proc sql将具有不同结构的多个表堆叠到一个表中
【发布时间】:2019-01-03 18:48:06
【问题描述】:

我在 SAS 中创建了多个具有不同字段名称的表,我想将这些表堆叠成一个表并将其导出到 Excel。我知道这不是标准的,但它适用于将表格导出到 Excel 而不是多个。

如何在 proc sql 中做到这一点?

【问题讨论】:

  • 你的 DBMS 是什么?
  • @Ian-Fogelman 这是 SAS,带有 PROC SQL。

标签: sql sas outer-join


【解决方案1】:

如果您使用的是 SAS 9.4 TS1M3+,请改用 ODS EXCEL。

ods excel file = 'C:\_localdata\demo.xlsx' options(sheet_interval = 'none') style=meadow;

   proc print data=sashelp.cars (obs=5);
   proc print data=sashelp.air (obs=5);
   proc print data=sashelp.class (obs=5);
   run;

ods excel close;

【讨论】:

  • Proc Print 产生我需要的东西。有什么办法可以用 proc sql 做同样的事情吗?我不想合并、加入、...表。无论变量名称如何,只需将表格放在一起即可。
  • 查看其他答案的回复。
【解决方案2】:

@Reeza 的答案是一个干净的答案,但如果你想在 proc sql 中做同样的事情,那么你需要在插入语句中使用你想要做的列的名称(数据类型应该匹配)。让我通过一个例子来说明

 /* first create table with most columns you want*/
 proc sql;
 create table class as
 select * from sashelp.class; 

 /*first create table with one less column*/
 proc sql;
 create table class1(drop=height) as
 select * from sashelp.class;

/*createsecond table with one less column*/
proc sql;
create table class2(drop = height sex)
as select * from class;
 /* insert can be done into first table with lesser columns by explicitly mentioning  columns in parenthesis as shown below */
 proc sql;
insert into class(name,sex, age, weight)
select * from class1;

 /* insert can be done into first table with  more lesser columns by explicitly 
   mentioning  columns in parenthesis as shown below */
 proc sql;
insert into class(name,age, weight)
select * from class2;

然后你可以将proc导出到excel

【讨论】:

  • 没有 CREATE TABLE 语句的 PROC SQL 将与 PROC PRINT 相同,如果出于某种原因这确实很重要,但我怀疑这是 OP 想要用来堆叠数据的方法。
  • 但我正在插入主表
  • 抱歉,不清楚。我的意思是一般使用 PROC SQL 解决方案。目前还不清楚为什么这里必须使用 SQL。
【解决方案3】:

使用外部联合怎么样?

如果我正确理解了这个问题,您需要所有数据集中的所有列。

这是一个例子:

data test1;
x=1;
y=2;
run;
data test2;
    x=2;
    y=2;
    z=1;
run;
data test3;
    x=1;
    o=14;
    p=12;
run;

proc sql;

    create table TEST_O as
        select * from test1
        OUTER UNION
        select * from test2
        OUTER UNION
        select * from test3
    ;
quit;

当然,您不会有相同的列名,但您可以预处理数据集并动态重命名列,或者只是在选择中重命名它们并使用联合/联合,如下所示:

proc sql;

    create table TEST_O2 as
        select x as col1, y as col2 from test1
        UNION all
        select x as col1, y as col2, z as col3 from test2
        UNION all
        select  x as col1, o as col2, p as col3 from test3
    ;
quit;

【讨论】:

  • 它尝试合并变量并创建一些缺失值。我有多个异构表,我需要创建一个表。因此,我会有一些无意义的变量名和所有表相互堆叠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多