如何使用桥table在SAS中乘以和合并两个table?
How to multiply and merge two tables in SAS using a bridge table?
我正在尝试基于第三个“桥 table”合并两个 SAS table,并在此过程中执行一些计算。代码应该像“对于每个好的查找价格并计算年收入。”
我的原始数据:一个 table 与年度商品数量,一个 table 与价格和一个桥梁 table 与哪个价格用于哪个商品的信息。
data work.goods;
input date date. GoodA GoodB GoodC;
format date year. ;
datalines;
01Jan20 10 12 2
01Jan21 12 11 5
run;`
data work.price;
input date date. PriceA PriceB;
format date year.;
datalines;
01Jan20 220 110
01Jan21 250 120
run;
data work.bridgetable;
input goods . price .;
datalines;
GoodA PriceA
GoodB PriceB
GoodC PriceB
run;
到目前为止,我使用了一个 proc sql 语句,没有桥 table 中的信息。
proc sql;
create table work.result as
select goods.date,
goods.GoodA * price.PriceA as RevenueA,
goods.GoodB * price.PriceB as RevenueB,
goods.GoodC * price.PriceB as RevenueC
from work.goods as goods, work.price as price
where goods.date = price.date;
quit;
现在,我想使用来自桥 table 的信息,以便我可以更改商品的价格分配(例如,将 PriceB 改为 PriceA 用于 GoodC)。此外,我想让代码在没有硬编码的情况下更加动态,这样我就可以在 table 中添加新商品和价格,而无需重新编码 [=] 的“select”部分26=]声明。
如何在 proc sql 中实现桥 table?
非常感谢您的帮助!
您的前两个表格需要是垂直的,而不是水平的。那么在添加新商品或新价格类别时结构不会改变。
您可以使用 PROC TRANSPOSE 来转换您当前的表格。
data goods;
input year GoodA GoodB GoodC;
datalines;
2020 10 12 2
2021 12 11 5
;`
data price;
input year PriceA PriceB;
datalines;
2020 220 110
2021 250 120
;
data bridgetable;
input goods . price .;
datalines;
GoodA PriceA
GoodB PriceB
GoodC PriceB
;
proc transpose data=goods
name=goods
out=goods_tall(rename=(col1=amount))
;
by year;
var good: ;
run;
proc transpose data=price
name=price
out=price_tall(rename=(col1=unit_price))
;
by year;
var price: ;
run;
现在可以轻松加入表了。
proc sql ;
create table want as
select *,unit_price*amount as revenue
from goods_tall
natural join price_tall
natural join bridgetable
;
quit;
结果
unit_
Obs goods price year amount price revenue
1 GoodA PriceA 2020 10 220 2200
2 GoodB PriceB 2020 12 110 1320
3 GoodC PriceB 2020 2 110 220
4 GoodA PriceA 2021 12 250 3000
5 GoodB PriceB 2021 11 120 1320
6 GoodC PriceB 2021 5 120 600
我正在尝试基于第三个“桥 table”合并两个 SAS table,并在此过程中执行一些计算。代码应该像“对于每个好的查找价格并计算年收入。”
我的原始数据:一个 table 与年度商品数量,一个 table 与价格和一个桥梁 table 与哪个价格用于哪个商品的信息。
data work.goods;
input date date. GoodA GoodB GoodC;
format date year. ;
datalines;
01Jan20 10 12 2
01Jan21 12 11 5
run;`
data work.price;
input date date. PriceA PriceB;
format date year.;
datalines;
01Jan20 220 110
01Jan21 250 120
run;
data work.bridgetable;
input goods . price .;
datalines;
GoodA PriceA
GoodB PriceB
GoodC PriceB
run;
到目前为止,我使用了一个 proc sql 语句,没有桥 table 中的信息。
proc sql;
create table work.result as
select goods.date,
goods.GoodA * price.PriceA as RevenueA,
goods.GoodB * price.PriceB as RevenueB,
goods.GoodC * price.PriceB as RevenueC
from work.goods as goods, work.price as price
where goods.date = price.date;
quit;
现在,我想使用来自桥 table 的信息,以便我可以更改商品的价格分配(例如,将 PriceB 改为 PriceA 用于 GoodC)。此外,我想让代码在没有硬编码的情况下更加动态,这样我就可以在 table 中添加新商品和价格,而无需重新编码 [=] 的“select”部分26=]声明。
如何在 proc sql 中实现桥 table?
非常感谢您的帮助!
您的前两个表格需要是垂直的,而不是水平的。那么在添加新商品或新价格类别时结构不会改变。
您可以使用 PROC TRANSPOSE 来转换您当前的表格。
data goods;
input year GoodA GoodB GoodC;
datalines;
2020 10 12 2
2021 12 11 5
;`
data price;
input year PriceA PriceB;
datalines;
2020 220 110
2021 250 120
;
data bridgetable;
input goods . price .;
datalines;
GoodA PriceA
GoodB PriceB
GoodC PriceB
;
proc transpose data=goods
name=goods
out=goods_tall(rename=(col1=amount))
;
by year;
var good: ;
run;
proc transpose data=price
name=price
out=price_tall(rename=(col1=unit_price))
;
by year;
var price: ;
run;
现在可以轻松加入表了。
proc sql ;
create table want as
select *,unit_price*amount as revenue
from goods_tall
natural join price_tall
natural join bridgetable
;
quit;
结果
unit_
Obs goods price year amount price revenue
1 GoodA PriceA 2020 10 220 2200
2 GoodB PriceB 2020 12 110 1320
3 GoodC PriceB 2020 2 110 220
4 GoodA PriceA 2021 12 250 3000
5 GoodB PriceB 2021 11 120 1320
6 GoodC PriceB 2021 5 120 600