合并两个数据集
Merging the two datasets
Dataset A:
Company_Name Match Sales EMPS
1234 0 0 0
1234 0 0 0
1234 0 0 0
5678 0 0 0
5678 0 0 0
5678 0 0 0
9123 9123 500 2
9123 9123 500 2
9123 9123 500 2
Dataset B:
Company_Name Match Sales EMPS
1234 1234 600 10
1234 1234 600 10
1234 1234 600 10
5678 5678 900 56
5678 5678 900 56
5678 5678 900 56
我正在尝试使用 proc sql 合并上述 tables,这是所需的输出
Dataset A:
Company_Name Match Sales EMPS
1234 1234 600 10
1234 1234 600 10
1234 1234 600 10
5678 5678 900 56
5678 5678 900 56
5678 5678 900 56
9123 9123 500 2
9123 9123 500 2
9123 9123 500 2
但是,当我尝试进行连接时,它只采用第一个 table 的值。我知道我应该在某个地方做一个案例陈述,但不确定如何做。例如,由于 datasetb 具有 company_name=1234 的值,因此最终输出应该捕获该值,如果没有值,它应该采用第一个 table 的列值,如果这有意义的话
proc sql;
create table merge_table as
select a.*,b* from dataseta as a inner join datasetb as b on (a.company_name=b.company_name);quit;
使用 COALESCE() 函数编写您对 B 值的偏好,而不是 A 值。
create table merge_table as
select a.company_name
, coalesce(b.match,a.match) as match
, coalesce(b.sales,a.sales) as sales
, coalesce(b.EMPS,a.EMPS) as EMPS
from dataseta as a
inner join datasetb as b
on (a.company_name=b.company_name)
;
但是您的示例在两个数据集中都重复了 COMPANY_NAME。你想怎么处理?目前,它会将 A 公司 1234 的三个记录中的每一个与 B 公司 1234 的三个记录中的每一个进行匹配,并在结果集中为该公司生成 9 条记录。您需要在连接条件中包含一些其他变量,以便执行 1 对 1 匹配(或至少 1 对 N 匹配)而不是当前的 N 对 M 匹配。
假设要替换的零行和非零行的数量相同,请考虑一个 union
查询来堆叠非零和其他数据集:
proc sql;
create table merge_table as
select b.Company_Name, b.Match, b.Sales, b.EMPS
from datasetb as b
union
select a.Company_Name, a.Match, a.Sales, a.EMPS
from dataseta as a
where (a.Match + a.Sales + a.EMPS) ^= 0;
quit;
Dataset A:
Company_Name Match Sales EMPS
1234 0 0 0
1234 0 0 0
1234 0 0 0
5678 0 0 0
5678 0 0 0
5678 0 0 0
9123 9123 500 2
9123 9123 500 2
9123 9123 500 2
Dataset B:
Company_Name Match Sales EMPS
1234 1234 600 10
1234 1234 600 10
1234 1234 600 10
5678 5678 900 56
5678 5678 900 56
5678 5678 900 56
我正在尝试使用 proc sql 合并上述 tables,这是所需的输出
Dataset A:
Company_Name Match Sales EMPS
1234 1234 600 10
1234 1234 600 10
1234 1234 600 10
5678 5678 900 56
5678 5678 900 56
5678 5678 900 56
9123 9123 500 2
9123 9123 500 2
9123 9123 500 2
但是,当我尝试进行连接时,它只采用第一个 table 的值。我知道我应该在某个地方做一个案例陈述,但不确定如何做。例如,由于 datasetb 具有 company_name=1234 的值,因此最终输出应该捕获该值,如果没有值,它应该采用第一个 table 的列值,如果这有意义的话
proc sql;
create table merge_table as
select a.*,b* from dataseta as a inner join datasetb as b on (a.company_name=b.company_name);quit;
使用 COALESCE() 函数编写您对 B 值的偏好,而不是 A 值。
create table merge_table as
select a.company_name
, coalesce(b.match,a.match) as match
, coalesce(b.sales,a.sales) as sales
, coalesce(b.EMPS,a.EMPS) as EMPS
from dataseta as a
inner join datasetb as b
on (a.company_name=b.company_name)
;
但是您的示例在两个数据集中都重复了 COMPANY_NAME。你想怎么处理?目前,它会将 A 公司 1234 的三个记录中的每一个与 B 公司 1234 的三个记录中的每一个进行匹配,并在结果集中为该公司生成 9 条记录。您需要在连接条件中包含一些其他变量,以便执行 1 对 1 匹配(或至少 1 对 N 匹配)而不是当前的 N 对 M 匹配。
假设要替换的零行和非零行的数量相同,请考虑一个 union
查询来堆叠非零和其他数据集:
proc sql;
create table merge_table as
select b.Company_Name, b.Match, b.Sales, b.EMPS
from datasetb as b
union
select a.Company_Name, a.Match, a.Sales, a.EMPS
from dataseta as a
where (a.Match + a.Sales + a.EMPS) ^= 0;
quit;