尝试连接两个数据集。一个月有未偿还股票,另一个有每日股价。我需要每日价格与他们的月度股票相匹配,这样我就可以将它们相乘。
样本数据是两组。价格变量为:date
,firm
,price
。共享变量为date
,firm
,Shareout
。
合并后的数据集应该Shareout
添加到prices
。因此,按月计算的已发行股票应仅在每个月末更改。现在表合并但sharesout
都是空的。
prices :
Date FIRM PRICE
1/1/2013 1 2
2/1/2013 1 2.05
3/1/2013 1 2.04
shareout :
Date FIRM SHAREOUT
1/1/2013 1 200,000
1/2/2013 1 215,000
1/3/2013 1 250,000
New Table - temp1 :
Date FIRM Price SHAREOUT
1/1/2013 1 2 200,000
2/1/2013 1 2.05 200,000
3/1/2013 1 2.04 200,000
代码是:
proc sql;
create table temp1 as
select a.*, b.shareout from index.prices as a
left join index.shareout as b on a.firm=b.firm and month(a.date)=month(b.date);
quit;
生成的内容:
Date Firm Price Shareout
1/1/2013 1 2 -
Proc Contents table1
ASX Char 10 $CHAR10. $CHAR10.
CLOSE Num 8 BEST7. BEST7.
Date Num 8 YYMMDD10. YYMMDD10.
HI Num 8 BEST7. BEST7.
LOW Num 8 BEST7. BEST7.
Tick Num 8 BEST5. BEST5.
Proc Contents table2
asx Char 6 $CHAR10. $6.
date Num 8 DDMMYYS10.
shareout Num 8 BEST12. BEST32.
year Num 8 BEST12. BEST32.
干杯。
答案 0 :(得分:1)
为了在逻辑上正确,你应该参加年月和月份比赛:
month(a.date)=month(b.date) and year(a.date)=year(b.date)
但是,您作为PROC CONTENTS输出提供的内容与您的代码不匹配:源表列列表中没有firm
字段,因此我猜您对数据或样本数据的假设不准确输出提供。
我建议您只检查您的数据,例如像这样:
proc sql;
select distinct year(date), month(date) from index.prices where firm=1;
select distinct year(date), month(date) from index.shareout where firm=1;
quit;
答案 1 :(得分:0)
我无法看到如何通过存储数字的字符列来解决区分大小写问题。在下壳和下壳中,1都是1。如果Firm是问题列,我怀疑你的问题可能是前导空格。
您可以尝试压缩固定连接,例如
left join index.shareout as b
on compress(a.firm) = compress(b.firm)
and month(a.date)=month(b.date);
这将在连接表时从两个Firm实例中删除任何空格。