如何按不同条件合并三个表?

How to merge three tables by different conditions?

我正在尝试根据连接的数据集进行一些计算。 我的目标是计算上一年的价格收入。 下面的代码适用于当前价格和销售额的收入。

data work.price;
  input date date. car $ price;
  format date date9. ;
  datalines;
01Jan19 Model1 7000 
01Jan19 Model2 4000
01Jan19 Model3 5000
01Jan20 Model1 7500 
01Jan20 Model2 4800
01Jan20 Model3 4500
01Jan21 Model1 8000 
01Jan21 Model2 5200
01Jan21 Model3 4000
run; 

data work.sales;
  input date date. type $ sales;
  format date date9. ;
  datalines;
01Jan19 A 10 
01Jan19 B 4
01Jan19 C 50
01Jan20 A 18 
01Jan20 B 10
01Jan20 C 16
01Jan21 A 22 
01Jan21 B 8
01Jan21 C 13
run; 

 data work.assignment;
  input car . type .;
  datalines;
Model1 A
Model2 B
Model3 C
run;


proc sql ;
create table want as 
  select Date format date9., *,price*sales as return
  from sales
  natural join price
  natural join assignment
;
quit;

到目前为止,我的解决方案是在加入之前改变价格的时间序列。 但是我想知道在proc sql语句中是否可以更高效地完成这一步。

data work.price; 
set work.price;
Date = intnx('month',date,+12);
run;

非常感谢您的帮助!

您可以通过使用内部联接并指定联接条件来实现。对你来说,这就像

proc sql;
  create table want as
  select
    p.date format date9., s.type, s.sales, p.car, p.price, p.price * s.sales as return
  from
    sales as s
  inner join
    prices as p
  on
    intnx("year", s.date, 1) = p.date
  inner join
    assignment as a
  on
    s.type = a.type and
    p.car = a.car;
quit;

就我个人而言,我总是进行显式内部联接而不依赖于自然联接。如果您的输入数据有问题,您会得到错误而不是错误的结果。此外,需要明确选择所需的列,而不仅仅是选择 *.