如何按不同条件合并三个表?
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;
就我个人而言,我总是进行显式内部联接而不依赖于自然联接。如果您的输入数据有问题,您会得到错误而不是错误的结果。此外,需要明确选择所需的列,而不仅仅是选择 *.
我正在尝试根据连接的数据集进行一些计算。 我的目标是计算上一年的价格收入。 下面的代码适用于当前价格和销售额的收入。
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;
就我个人而言,我总是进行显式内部联接而不依赖于自然联接。如果您的输入数据有问题,您会得到错误而不是错误的结果。此外,需要明确选择所需的列,而不仅仅是选择 *.