合并两个数据集

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;