我想计算不丢失值的列中日期的出现次数。例如,我想计算汽车维修的次数,而不是包括没有服务日期的空值。
我尝试了简单的计数功能,但它带来了所有记录。我想过使用'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;
我添加了我正在使用的代码。它给出了日期的计数,但也包括日期值为空的位置。
答案 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;