【问题标题】:How to store the outputs from three different tables into one table?如何将三个不同表的输出存储到一个表中?
【发布时间】:2019-11-14 22:37:10
【问题描述】:

我有三个由三个不同的宏创建的数据集/表:一个用于数字字段,一个用于分类字段,一个用于日期字段。当我调用宏时,我会这样做

%pnum(databasename, tablename, variablename)
%pcat(databasename, tablename, variablename)
%pdate(databasename, tablename, variablename)

第一个表(table1)看起来像:

databasename | tablename| variablename| mean| N| missing | stddev 

第二个表(table2)看起来像:

databasename | tablename| variablename| S | N| missing| stddev| completeness

第三张表(table3)长这样:

databasename | tablename| variablename| minimum date| maximum date| mean 

我想创建一个表(最终表),其中包含来自前三个宏的数据值:

databasename | tablename| variablename|  mean| N| missing | stddev |S| completeness

我尝试创建一个libname results 来存储结果并使用proc sql 创建一个新表:

proc sql;
create table result.final as 
select t1.*
,t2.S
,t2.compleness
,t3.minimum_date
,t3.maximum_date
from table1 t1
left join table2 t2
on t1.date=t2.date
left join table3 t3
on t1.date=t2.date;
quit;

其中date 是所有表共有的(是表分组字段)。 但是,但这在我运行宏时不起作用:例如,我运行 pnum 并收到错误消息

table final 不存在

错误是由于这部分代码:

proc sql;
insert into results.final;
t1.*
from table1 t1;
quit;

可能我正在尝试将列及其值插入尚未创建的数据集中。

然后我的问题是:如何使用该 libname 创建一个新数据集,该数据集从这些宏创建的表中收集和存储所有值,如最终表所示?最后我想做的是将这段代码创建到一个新的宏中。

我希望你能帮助我。谢谢

【问题讨论】:

  • 您是否需要覆盖一行,例如在以后重新测量特定数据库/表/变量时?此外,问题中的第一个 sql 代码确实与表描述匹配——这三个部分未显示为具有数据列,并且左连接 t3 不正确(在 t1.date=t2.date 上)
  • 当该变量不在任何来源中时,您为什么要尝试在 DATE 加入?您需要合并数据还是只是堆叠观察结果?如果您需要合并它们,那么您想使用哪个公共变量(MEAN、STDDEV)的来源?还是您想重命名这些变量,使它们成为不同的变量?

标签: sql sas


【解决方案1】:

您能否将数据集合并在一起,然后将其分配给库?

    data [library].final;
merge table1 table2 table3;
by date;
run;

【讨论】:

  • 在这种情况下,共同的列会发生什么?我想加入表,但可能我错了
  • 创建一个空表然后填充也是错的吗?我正在考虑不同的方法来进行,但我不知道它们是否有效以及如何正确实施它们
  • 具有相同名称的列将在 proc sql / merge 语句中被替换,如果您希望保留所有列,您可以将表名(或缩写)连接到每个列事先命名 - 巧妙地使用宏和 dictionary.tables 将在这里工作。创建一个空表并没有错,但如果您要在之后立即填充它,通常可以避免这种情况,只有少数小众场景是首选解决方案
  • 如果其中一张表不存在怎么办?
  • 在这种情况下你会得到一个错误。如果有多个表要合并,并且有可能一个或多个不存在,请使用一致的命名标准来命名表,然后使用通配符“:”将它们合并在一起。例如数据合并数据集;合并表:;跑; -- 这将合并所有以“TABLE”开头的表
【解决方案2】:

使用数据步骤 + SET 将数据集附加在一起。

data want;
 set t1 t2 t3 indsname=source;
 dsname = source; *This will store the name of the input data set;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2020-08-05
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    相关资源
    最近更新 更多