计算值不丢失的位置

时间:2013-01-21 20:49:04

标签: sql sas

我想计算不丢失值的列中日期的出现次数。例如,我想计算汽车维修的次数,而不是包括没有服务日期的空值。

我尝试了简单的计数功能,但它带来了所有记录。我想过使用'case',但我不确定语法。我正在使用SAS Enterprise Guide。

样本日期

id    car     service_Date
1     honda   01/01/2005
2     honda   01/01/2006
3     honda   
4     honda   01/01/2008
5     honda   
6     honda   01/01/2010

结果:我想只有4作为答案,所以不计算空值。

PROC SQL;
CREATE TABLE WORK.QUERY_FOR_CARS AS 
SELECT 
t1.CAR,
t1.ID  
/* SERVICE_DATE */
(count (case when t1.S_DATE is not null then 0 end)) AS SERVICE_DATE
FROM WORK.QUERY_FOR_CAR_SERVICE
GROUP BY t1.S_DATE;
QUIT;

我添加了我正在使用的代码。它给出了日期的计数,但也包括日期值为空的位置。

6 个答案:

答案 0 :(得分:6)

给定一个名为CARS的SAS数据集,其中包含示例中的变量,您可以在SQL中找到具有非缺失值service_date的观察数量两种不同的方式:

proc sql;

   select count(service_date) as num_not_missing
   from cars;

   select count(*) as num_not_missing
   from cars
   where service_date is not null;

quit;

第一个示例指定count函数中的service_date变量,该变量将忽略缺失值。第二个在应用where子句后计算所有行。两者表现相同。

答案 1 :(得分:4)

MS Sql Server的两个选项:

SELECT COUNT([service_Date]) FROM [table1]

SELECT COUNT(*) FROM [table1] WHERE [service_Date] IS NOT NULL

有关COUNT()的更多信息,请参阅MSDN

答案 2 :(得分:3)

默认情况下count(service_date)排除空值,与count(*)相反,后者计算所有行。

答案 3 :(得分:0)

您可以尝试WHERE column != "",或者如果您没有NULL,则可以使用WHERE CHAR_LENGTH(column) > 3

答案 4 :(得分:0)

Lamak,

有几种方法可以解决这个问题。这是我将使用的方法,避免使用PROC SQL。

/* Set up example data */    
data   YourTable;
input id car $ service_Date;
informat service_Date mmddyy10.;
format service_Date mmddyy10.;
cards;

1 honda 01-01-2005
2 honda 01-01-2006
3 honda ""
4 honda 01-01-2008
5 honda ""
6 honda 01-01-2010

run;

/* Count non null records */
data work.CountTable(keep=NbrNulls);
 set work.YourTable(where=(service_date ne .)) end=last;
 if last;
 NbrNulls=_N_;
run;

根据您使用该计数的方式,您可以在最后一个数据步骤的末尾添加“call symputx()”函数,将其称为其他地方的宏变量。

结果是4。

答案 5 :(得分:0)

如果它可以来自另一个Proc (Proc Means)

data have;
 input car $ service_date mmddyy10.;
 format service_date mmddyy10.;
datalines;
honda 01/01/2005
honda 01/01/2006
honda
honda 01/01/2008
honda
honda 01/01/2010
toyota 01/01/2005
toyota 01/01/2006
toyota
toyota 01/01/2008
toyota
toyota 01/01/2010
;

Proc Means N data=work.have noprint; 
 var service_date;
 by car;
 output out=work.want(drop= _type_ _freq_)  n=count;
run;