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试图做的是一对多的合并/连接,而不仅仅是插入。