2014-12-29 22 views
0

下面修订示例代码 - 使用内SAS SQL:萨姆和在执行左侧计数的变量加入

proc sql; 
    create table add_losses as 
    select *, 
    sum(bb.gross_loss) as gl format = comma15.2, 
    count(bb.gross_loss) as n_losses 
    from add_startend as aa 
    left join LED as bb 
    on (aa.process_name = bb.process_name and 
     aa.group_id = bb.group_code and 
     aa.start_date le bb.first_loss_posting_date le aa.end_date) 

    group by aa.process_name, aa.group_id, aa.start_date, aa.end_date 
    order by aa.process_name, aa.group_id, aa.start_date, aa.end_date; 
quit; 

实施例的数据和下面所需的输出:

表AA

variable 1 variable 2 start date end date 
AAAA  BBB   1/1/2010 6/1/2010 

表BB

variable 1 variable 2 Date  losses 
AAAA  BBB   1/5/2010 100 
AAAA  BBB   2/1/2010 100 
AAAA  BBB   3/5/2010 100 
AAAA  BBB   4/23/2010 100 
AAAA  BBB   5/11/2010 100 
AAAA  BBB   5/25/2010 100 

表YY(电流输出)

variable 1 variable 2 Date gross_loss gl n_losses 
AAAA  BBB   1/5/2010 100  600 6 
AAAA  BBB   2/1/2010 100  600 6 
AAAA  BBB   3/5/2010 100  600 6 
AAAA  BBB   4/23/2010 100  600 6 
AAAA  BBB   5/11/2010 100  600 6 
AAAA  BBB   5/25/2010 100  600 6 

表XX(所希望的输出)

variable 1 variable 2 start date end date gl n_losses 
AAAA  BBB   1/1/2010 6/1/2010 600  6 

的问题是目前的代码创建附加意见。我想在表格AA中保留相同的行数和所有变量,同时在列'gl'和'n_losses'上添加。

+0

请编辑您的问题与样本数据和预期输出。 –

回答

0

可以之间使用子句为这种类型的条件

proc sql; 
create table add_losses as 
select aa.*, bb.gl format, bb.n_losses 
from 
add_startend as aa 
left join 
(
select aa.process_name, aa.group_id, aa.start_date, aa.end_date, 
sum(bb.gross_loss) as gl format = comma15.2, 
count(bb.gross_loss) as n_losses 
from add_startend as aa  
left join LED as bb 

on (aa.process_name = bb.process_name and 
aa.group_id = bb.group_code and 
bb.first_loss_posting_date between aa.start_date and aa.end_date) 

group by aa.process_name, aa.group_id, aa.start_date, aa.end_date 
) bb 
on aa.process_name = bb.process_name 
and aa.group_id = bb.group_code 
and aa.start_date = aa.start_date 
and aa.end_date = bb.end_date 
order by aa.process_name, aa.group_id, aa.start_date, aa.end_date; 
quit; 
+0

上面的代码仍然会导致每次有多于一行的BB匹配AA中的一行时创建额外的观察结果。此外,我欣赏编码提示,但'between'没有指定日期范围是否相互排斥。取决于这个特性,我们希望使用<=或<,但是我不清楚使用 – Crazysasman

+0

您是否在使用> =和<=之间使用了组,并通过条目 – Santhosh

+0

进行了排序。你需要这个吗?或DP你需要> =和<? – Santhosh

0

我会推荐使用Google教程 - 特别是涵盖group by声明的一个SQL教程。一旦您了解了group by的工作原理,请查看SQL聚合函数count()sum()

编辑:

我建议以下变化:当使用一组-by语句,你应该明确地列出你的(而不是仅仅使用打算到组变量

  • a *)在SELECT语句中。
  • 使用between运算符进行日期比较,因为它更易于理解
  • 请始终确保select语句中的每个列都是聚合函数的一部分,或者在您的group by子句中。

创建示例数据:

data a; 
    informat start_date end_date mmddyy10.; 
    format start_date end_date yymmdd10.; 
    input variable_1 $ 
     variable_2 $ 
     start_date 
     end_date 
     ; 
    datalines; 
AAAA  BBB   1/1/2010 6/1/2010 
run; 

data b; 
    informat date mmddyy10.; 
    format date yymmdd10.; 
    input variable_1 $ 
     variable_2 $ 
     date 
     losses 
     ; 
    datalines; 
AAAA  BBB   1/5/2010 100 
AAAA  BBB   2/1/2010 100 
AAAA  BBB   3/5/2010 100 
AAAA  BBB   4/23/2010 100 
AAAA  BBB   5/11/2010 100 
AAAA  BBB   5/25/2010 100 
run; 

最终查询:按组作为其更容易编写声明

proc sql; 
    create table add_losses as 
    select a.variable_1, 
     a.variable_2, 
     a.start_date, 
     a.end_date, 
     count(b.variable_1) as n_losses, 
     sum(b.losses) as gl format=comma15.2 
    from a 
    left join b on a.variable_1 eq b.variable_1 
      and a.variable_2 eq b.variable_2 
      and b.date between a.start_date and a.end_date 
    group by 1,2,3,4 
    order by 1,2,3,4 
    ; 
quit; 

注意我用速记别名在/保持和理解。或者你也可以明确地列出这样的列:

group by a.variable_1, a.variable_2, a.start_date, a.end_date 
+0

请参阅上文 - 我的代码现在包含此语法,但原始问题仍然存在 - 代码为每个匹配创建一个新观察值,当时我只想将摘要统计信息附加到现有表AA。 – Crazysasman

0

像下面会给你的结果(这可能略有基于数据库技术)的查询:

select aa.variable1, 
     aa.variable2, 
     aa.start_date, 
     aa.end_date, 
     sum(bb.sales) as sales, 
     count(*) as n_sales 
    from table aa 
      join bb on (
       aa.variable1 = bb.variable1 and 
       aa.variable2 = bb.variable2 and 
       aa.start_date >= bb.date and 
       aa.end_date < bb.date) 
group by aa.variable1, aa.variable2, aa.start_date, aa.end_date 
order by aa.variable1, aa.variable2, aa.start_date, aa.end_date 
+0

这看起来很有帮助,但我认为我设置“创建表”部分并指定AA和BB的数据集与您的语法不兼容的方式。你能否包括如何指定哪个数据集是AA和BB?另外我需要保留来自AA的所有变量,所以我怀疑不需要第一个“选择”部分。 – Crazysasman