SAS-计算在给定时间段内发生的事件

时间:2015-05-06 21:37:52

标签: date count sas proc-sql

我正在尝试编写一个简单的代码来计算每年为各种提供商提供的服务数量,基于单个原始列。理想情况下,我的输出将简单地看起来像:

输入数据看起来像这样:

Prov_ID    Name    Service_Cd  Date
A          Joe     B2           02JUN2012
A          Joe     C9           04OCT2013
A          Joe     B2           12JUL2014
B          Steve   A1           12MAR2012
B          Steve   E4           20OCT2013
C          Tom     B10          23SEP2012
...        ...     ...          ...
...        ...     ...          ...

等等,目标是拥有唯一的提供商ID,执行的服务总数,然后是2012年,2013年,2014年的总计。

ProvID  Name  Service_Count  2012_Count  2013_Count  2014_Count
A       Joe    12             4            6            2
B       Steve  15             5            5            5 
C       Tom    22             10           8            4

我为此特定任务编写的代码的当前版本变得迟钝,包括:

proc sql;
CREATE TABLE provider_detail as
    SELECT distinct(PROV_ID), COUNT(distinct Service_CD)AS Service_Count, COUNT (date between '01JAN2012'd AND '31DEC2012'd)AS 2012_Count,COUNT (date between '01JAN2013'd AND '31DEC2013'd)AS 2013_Count,COUNT (date between '01JAN2014'd AND '31DEC2014'd)AS 2014_Count
    FROM primary1
    Group BY PROV_ID;
    run;

但是这样做我在每一栏都得到相同的数量。任何帮助都会非常感激,因为我是SAS的新手并且还在学习绳索。谢谢!

1 个答案:

答案 0 :(得分:1)

主要是date between位错误。这是SAS在PROC中通常很乐意为您做的事情,尽管SQL也不是特别复杂。

在SQL中,一个选项是使用case when来获取此类信息。请参阅以下内容:

proc sql;
    select make, count(distinct model) as total, 
        count(distinct case when driveTrain='Rear' then Model else ' ' end) as RWD,
        count(distinct case when driveTrain='Front' then model else ' ' end) as FWD,
        count(distinct case when driveTrain='All' then model else ' ' end) as AWD        
    from sashelp.cars
    group by make;
quit;

case when在sql中基本上是if:在行级别,它会有条件地执行某些操作,然后将其放入选择结果中。

当然,在SAS中,使用制表程序(proc freqproc meansproc tabulate)更容易做到:

proc tabulate data=sashelp.cars;
    class make drivetrain;
    tables make,drivetrain*n;
run;

如下所述,这需要单独处理独特性。