2013-02-23 21 views
0

需要幫助理清這種情況下,SAS SQL查詢來解決,增加行不同變量

pr_id lob_id prec1  prec2 prec3 
112  1a  3478  56  77 
112  1b  3466  65  43 
112  1c  5677  57  68 
112  1d  5634  49  52 
215  2a  1234  43  45 
215  2b  9787  32  43 
215  2c  4566  39  90 
388  3a  8797  88  99 
388  3b  6579  58  72 
388  3c  9087  76  67 

需要的輸出:需要pr_id和各自lob_id觀察行不同意見的不同pr_id行。如下圖所示

pr_id lob_id prec1 prec2 prec3 lob_id prec1 prec2 prec3 lob_id prec1 prec2 prec3 lob_id prec1 prec2 prec3 
112 1a  3478 56  77  1b  3466 65  43  1c  5677 57  68 1d  5634 49 52 
215 2a  1234 43  45  2b  9787 32  43  2c  4566 39  90 .  .  .  . 
388 3a  8797 88  99  3b  6579 58  72  3c  9087 76  67 .  .  .  . 

我試圖與PROC轉做它,但變量名是從需要的輸出不同,你可以請幫我在這。

謝謝。

回答

1

這將盡可能地接近你想要的答案。這比需要的要複雜得多,但它確實能夠確保lob_id保持在預定的狀態。您不能爲多個變量使用相同的變量名,但您可以使用相同的標籤,因此我在添加_1 _2 _3等時保持相同的標籤。

然後您可以PROC打印數據集,如果您想要輸出窗口(並顯示標籤,從而在輸出中獲得所需的重複變量名稱)。

data have; 
input pr_id lob_id $ prec1  prec2 prec3; 
datalines; 
112  1a  3478  56  77 
112  1b  3466  65  43 
112  1c  5677  57  68 
112  1d  5634  49  52 
215  2a  1234  43  45 
215  2b  9787  32  43 
215  2c  4566  39  90 
388  3a  8797  88  99 
388  3b  6579  58  72 
388  3c  9087  76  67 
;;;; 
run; 
data have_pret; 
set have; 
by pr_id; 
array precs prec:; 
if first.pr_id then counter=0; 
counter+1; 
varnamecounter+1; 
valuet=lob_id; 
idname=cats("lob_id",'_',counter); 
idlabel="lob_id"; 
output; 
call missing(valuet); 
do __t = 1 to dim(precs); 
    varnamecounter+1; 
    valuen=precs[__t]; 
    idname=cats('prec',__t,'_',counter); 
    idlabel=vlabel(precs[__t]); 
    output; 
end; 
call missing(valuen); 
keep pr_id valuet valuen idname idlabel varnamecounter; 
run; 

proc sort data=have_pret out=varcounter(keep=idname varnamecounter); 
by idname varnamecounter; 
run; 

data varcounter_fin; 
set varcounter; 
by idname varnamecounter; 
if first.idname; 
run; 

proc sql; 
select idname into :varlist separated by ' ' 
from varcounter_fin order by varnamecounter; 
quit; 


proc transpose data=have_pret(where=(not missing(valuen))) out=want_n; 
by pr_id; 
var valuen; 
id idname; 
idlabel idlabel; 
run; 

proc transpose data=have_pret(where=(missing(valuen))) out=want_t; 
by pr_id; 
var valuet; 
id idname; 
idlabel idlabel; 
run; 

data want; 
retain pr_id &varlist.; 
merge want_n want_t; 
by pr_id; 
drop _name_; 
run; 

在SQL中這樣做很刺激; SAS不支持先進的SQL表格功能,它允許您在不對所有內容進行硬編碼的情況下進行整齊轉置。它會像

proc sql; 
select pr_id, 
max(lob_id1) as lob_id1, max(prec1_1) as prec1_1, max(prec2_1) as prec2_1, max(prec3_1) as prec3_1, 
max(lob_id2) as lob_id2, max(prec1_2) as prec1_2, max(prec2_2) as prec2_2, max(prec3_2) as prec3_2 from (
select pr_id, 
case when substr(lob_id,2,1)='a' then lob_id else ' ' end as lob_id1, 
case when substr(lob_id,2,1)='a' then prec1 else . end as prec1_1, 
case when substr(lob_id,2,1)='a' then prec2 else . end as prec2_1, 
case when substr(lob_id,2,1)='a' then prec3 else . end as prec3_1, 
case when substr(lob_id,2,1)='b' then lob_id else ' ' end as lob_id2, 
case when substr(lob_id,2,1)='b' then prec1 else . end as prec1_2, 
case when substr(lob_id,2,1)='b' then prec2 else . end as prec2_2, 
case when substr(lob_id,2,1)='b' then prec3 else . end as prec3_2 
from have) 
group by pr_id; 
quit; 

而是擴大到包括3和4。你可以看到爲什麼這是愚蠢到做在SQL我希望:)的SAS代碼可能實際上更短,並做遠遠更多的工作例如,如果你只是對保留語句進行硬編碼,那麼你可以跳過其中的一半。

+0

非常感謝喬對你的幫助,這真的很有幫助,並且幫助我解決了我的問題,再一次感謝你Joe – sweta 2013-02-26 17:00:30