1

我需要对以下方法的建议(在 SAS 企业指南 6.1 中工作)

我有 2 个表:表 1:状态、日期、十进制值、说明(字符长度 4);表 1 有每个州的多个描述、日期和值

表2:状态、年份、季度、描述(字符长度4)、值;表 2 有多个相同状态和描述的记录,但值会根据日期而变化。

样品表:

Table 1
state      date    description    value 1
IA        11/1/2013     A          -0.5
IA        11/1/2013     B           4.5
IA        9/1/2012      A           1.2
IA        9/1/2012      B            5
OH        6/1/2013      A           1.2
OH        6/1/2013      B           -2
Table 2
State   Year    Quarter Description Value 2
IA      2013    4        A          40,350 
IA      2013    3        A          1 
IA      2013    2        A          150,000 
IA      2013    1        A          100,000 
IA      2012    4        A          5,000 
IA      2012    3        A          25,000 
IA      2012    2        B          50,000 

对于表 1 中的每个观察,我希望能够识别与观察相关的日期,然后将表 2 中从该日期起 1 年内的特定状态和描述的值相加,保存总和,然后重复它适用于表 1 中的每条记录。

结果我正在寻找
表3

state    date    Descr    Value 1    Sum of Value 2 (over a year)
IA    11/1/2013    A    -0.5    =sum (Value 2 from (2013 quarter 4, 2013 quarter 3, 2013 quarter 2, 2013 quarter 1) for IA with desc = A)
IA    09/1/2012    B     5.0    =sum(Value 2 from (2012 quarter 2, 2012 quarter 1, 2011 quarter 4, 2011 quarter 3) for IA with Desc = B)                            

我正在努力从表 1 中找出正确的观察结果,以便在表 2 中选择日期、状态和描述来总结。

谢谢你。

4

1 回答 1

0

最简单的答案很可能是最好的:SQL 连接。将季度转换为日期而不是相反 - 我认为这比将事物转换为季度更容易,因为intck它非常友好。我在这里展示了如何在数据集或 sql 中执行此操作。

data Table1;
input state $ date :mmddyy10. description $ value1;
format date DATE9.;
datalines;
IA        11/1/2013     A          -0.5
IA        11/1/2013     B           4.5
IA        9/1/2012      A           1.2
IA        9/1/2012      B            5
OH        6/1/2013      A           1.2
OH        6/1/2013      B           -2
;;;;
data table2;
input State $ Year Quarter Description $ Value2 :comma10.;
datevar = mdy(quarter*3,1,year);
format datevar DATE9.;
datalines;
IA      2013    4        A          40,350 
IA      2013    3        A          1 
IA      2013    2        A          150,000 
IA      2013    1        A          100,000 
IA      2012    4        A          5,000 
IA      2012    3        A          25,000 
IA      2012    2        B          50,000 
;;;;
run;

proc sql;
create table table3 as 
  select t1.state, t1.date,t1.description, t1.value1, sum(t2.value2) as value2sum
   from table1 t1 left join table2 t2
    on (t1.state=t2.state and t1.description=t2.description
        and 0 le intck('Quarter',mdy(t2.quarter*3,1,t2.year),t1.date) lt 4)
        group by t1.state, t1.date,t1.description,t1.value1;
quit;

您可能想要根据您想要根据什么值包含的确切记录来调整相等性,并且您可能需要调整intck以定义您想要的季度(您要求 2012Q2 和 2012 年 9 月 1 日,即会很奇怪,因为 9/1 通常肯定是第三季度的一部分;如果您的公司不是这样,请使用 shift index inintck来调整您公司的季度)。

于 2013-10-22T17:30:02.597 回答