Sql 插入带有条件的行
我有一张这样的桌子:Sql 插入带有条件的行,sql,sas,Sql,Sas,我有一张这样的桌子: 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
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
但它不起作用,因为我在第一个表中得到的行数与合并后的行数相同。因此,您可以这样做:
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'
所以,你可以这样做:
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'
在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
您可以在数据步骤中执行此操作,但不能使用合并;您可以使用“设置”和“关键点”选项来执行此操作。你必须在表上有一个索引才能这样做;见下文
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;
在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
您可以在数据步骤中执行此操作,但不能使用合并;您可以使用“设置”和“关键点”选项来执行此操作。你必须在表上有一个索引才能这样做;见下文
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;
虽然这是可行的,但我不建议在SAS中使用它;它比等效的数据步代码要复杂得多,更好的是使用表驱动逻辑,就像OP试图做的那样。无论如何,我认为问题的插入行部分具有误导性;OP试图做的是一对多的合并/加入,而不仅仅是插入;它比等效的数据步代码要复杂得多,更好的是使用表驱动逻辑,就像OP试图做的那样。无论如何,我认为问题的插入行部分具有误导性;OP试图做的是一对多的合并/连接,而不仅仅是插入。