我正在嘗試基于第三個“橋接表”合并兩個 SAS 表,并在此程序中執行一些計算。代碼應該像“對于每個好的查找價格并計算年收入”。
我的原始資料:一張表每年的商品數量,一張價格表和一張橋表,其中包含哪種價格用于哪種商品的資訊。
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 $5. price $7.;
datalines;
GoodA PriceA
GoodB PriceB
GoodC PriceB
run;
到目前為止,我使用了一個沒有橋表資訊的proc sql陳述句。
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;
現在,我想使用橋接表中的資訊,以便我可以將價格分配更改為商品(例如,GoodC 使用 PriceA 而不是 PriceB)。此外,我想讓代碼在沒有硬編碼的情況下更加動態,這樣我就可以在我的表中添加新的商品和價格,而無需重新編碼我的 sql 陳述句的“選擇”部分。
如何在proc sql中實作橋接表?
非常感謝你的幫助!
uj5u.com熱心網友回復:
您的前兩個表需要是垂直的而不是水平的。那么當添加新商品或新價格類別時,結構不會改變。
您可以使用 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 $5. price $7.;
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428259.html
下一篇:資料庫連接在哪里