3

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

我尝试了简单的计数功能,但它带来了所有记录。我想过使用“案例”,但我不确定语法。我正在使用 SAS 企业指南。

样品日期

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;

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

4

6 回答 6

7

给定一个名为 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子句后计算所有行。两者的表现相同。

于 2013-01-21T21:52:08.137 回答
4

MS Sql Server 的两个选项:

SELECT COUNT([service_Date]) FROM [table1]

或者

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

有关详细信息COUNT(),请参阅MSDN

于 2013-01-21T20:51:36.747 回答
3

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

于 2013-01-21T20:50:54.990 回答
0

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

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;
于 2013-01-21T23:24:47.577 回答
0

你可以试试,WHERE column != ""或者如果你没有 NULL 也许你可以使用WHERE CHAR_LENGTH(column) > 3

于 2013-01-21T20:51:54.683 回答
0

拉马克,

有几种方法可以解决这个问题。这是我将使用的方法,避免使用 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;

根据您打算如何使用该计数,您可以在最后一个数据步骤的末尾添加一个“调用 symputx()”函数,以便在其他地方将其作为宏变量调用。

结果是4。

于 2013-01-21T21:32:43.080 回答