2016-08-11 83 views
0

我想使用SAS Proc SQL在表中找到我行,其中每列都有一個非缺失值。有沒有辦法做到這一點,而不必列出所有的列名?這不起作用,但它可能會讓你知道我的預期輸出是什麼。使用SAS Proc SQL查找所有列不丟失的行?

Proc SQL; 
    Select * 
    from work.table 
    Where * is not null; 
Run; 

如果可能,我還想限制結果爲一個觀察值。謝謝。

回答

0

在SQL,因爲你不能在一個項目中的所有變量,而無需使用宏語言平凡的。在datastep中,這是微不足道的。

data class; 
    set sashelp.class; 
    if mod(_n_,3)=1 then call missing(age); 
run; 

data want; 
    set class; 
    if cmiss(of _all_)=0; 
run; 

cmiss指示1,如果一個字符或數字變量缺失(和特別是在這種情況下,計數missings的總數)。您可以使用數據步驟中的obs=1選項將其限制爲一個。

+0

這個工作!謝謝。對於將來可能想要使用Joe代碼的任何人的記錄,只需將if cmiss(of _all_)等於1而不是0,以獲得包含所有非缺失值的行。 –

+0

爲什麼要將它更改爲1?那意味着你尋找一行*一個*缺失值。所有的拒絕將是0. – Joe

+0

你是對的。最初cmiss = 0確實沒有返回結果,但我現在意識到這是因爲原始表中有一列,每一行都有一個缺失值。當我刪除該列時,是的,cmiss = 0是正確的。謝謝。 –

0

在SQL中,您必須是顯式的。 *不是擴展列的通用宏。它是在select *count(*)中恰好使用的句法元素。

所以,這樣的事情:

Proc SQL; 
    Select * 
    from work.table 
    Where col1 is not null and col2 is not null and col3 is not null . . . 
Run; 
1

使用SQL和字典表:

proc sql noprint; 
    select cats('not missing(', name, ')') 
    into :expression separated by " and " 
    from dictionary.columns 
    where libname = "SASHELP" and memname = "CLASS"; 
quit; 

proc sql outobs=1; 
    select * 
    from sashelp.class 
    where &expression.; 
quit;