我正在尝试编写一个简单的代码来计算每年为各种提供商提供的服务数量,基于单个原始列。理想情况下,我的输出将简单地看起来像:
输入数据看起来像这样:
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的新手并且还在学习绳索。谢谢!
答案 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 freq
,proc means
,proc tabulate
)更容易做到:
proc tabulate data=sashelp.cars;
class make drivetrain;
tables make,drivetrain*n;
run;
如下所述,这需要单独处理独特性。