SQL左连接两个数据集。一个月度数据与每日一个

时间:2014-10-07 03:11:11

标签: sql sas

尝试连接两个数据集。一个月有未偿还股票,另一个有每日股价。我需要每日价格与他们的月度股票相匹配,这样我就可以将它们相乘。

样本数据是两组。价格变量为:datefirmprice。共享变量为datefirmShareout

合并后的数据集应该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. 

干杯。

2 个答案:

答案 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实例中删除任何空格。