2013-01-21 37 views
2

我想計算列中值不會丟失的日期的發生次數。因此,例如,我要計算一輛汽車的維修次數,而不是在沒有維修日期的情況下包括空值。計算值不丟失的位置

我試過簡單的計數功能,但它帶來了所有的記錄。我想過使用'case',但我不確定語法。我正在使用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; 

我已經添加了我正在使用的代碼。它給了我日期的計數,但也包括日期值爲空的地方。

+0

您需要包括查詢和SQL方言。 – orbfish

+1

你應該看看'WHERE'語句 – Magnus

+0

什麼數據類型是Service_Date? (我會假定約會,但我見過陌生人) – xQbert

回答

2

默認情況下count(service_date)排除空值,與計數所有行的count(*)相反。

2

兩個選項的MS SQL Server:

SELECT COUNT([service_Date]) FROM [table1] 

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

更多關於COUNT(),看到MSDN

0

你可以試試,WHERE column != ""或者如果你沒有空,也許你可以使用WHERE CHAR_LENGTH(column) > 3

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; 

取決於你要如何使用數,你能在最後的數據步驟結束添加一個「呼叫symputx()」功能,它的其他地方打電話宏變量。

結果是4

5

給定數據集SAS包含在您的示例中的變量命名的汽車,你可以找到與service_date的非缺失值的兩種不同的方式在SQL觀測次數:

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子句後的所有行。兩者的表現完全相同。

+0

@xQbert服務是隻是一個日期。 – Beanie

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;