我有一张像这样的表:
ID Gar
1 A
2 B
3 C
4 A
5 C
我想创建这个表:
ID Gar Gar_Corr
1 A 1a
1 A 2a
1 A 3a
2 B B
3 C C
4 A 1a
4 A 2a
4 A 3a
5 C C
我想做的是每次有一个变量Gar等于A,在表3中插入具有相同ID和Gar的新行,但Gar_Corr变量等于1a,2a和3a。
我尝试将第一个表与这样的表合并:
Gar Gar_Corr
A 1a
A 1b
A 1c
B B
C C
但它没有工作,因为我在第一个表中获得的行数与合并后的行数相同。
答案 0 :(得分:2)
所以,你可以这样做:
INSERT INTO tbl2 (ID, Gar, Gar_Corr)
SELECT ID, Gar, '1a' FROM tbl1 WHERE Gar = 'A'
UNION
SELECT ID, Gar, '2a' FROM tbl1 WHERE Gar = 'A'
UNION
SELECT ID, Gar, '3a' FROM tbl1 WHERE Gar = 'A'
UNION
SELECT ID, Gar, Gar FROM tbl1 WHERE Gar <> 'A'
答案 1 :(得分:2)
在SAS中,您有几个选择。你可以做一个笛卡尔式的加入:
proc sql;
create table want as
select H.*, G.gar_corr from have H, gar_corr G
where H.gar=G.gar;
quit;
假设gar_corr是您描述的第二个表(gar / gar_corr)。
您可以在数据步骤中执行此操作,但不能使用合并;你可以使用set和key选项来完成它。你必须在表上有一个索引才能这样做;见下文。
data gar_corr(index=(gar));
input Gar $ Gar_Corr $;
datalines;
A 1a
A 1b
A 1c
B B
C C
;;;;
run;
data have(index=(gar));
input ID Gar $;
datalines;
1 A
2 B
3 C
4 A
5 C
;;;;
run;
data want;
set have;
do while (_IORC_ le 0); *_IORC_ will be positive when a match is NOT found;
set gar_corr key=gar;
if _IORC_=0 then output;
end;
run;