如何使用桥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