插入带有条件的行

时间:2014-04-02 16:25:06

标签: 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

我想做的是每次有一个变量Gar等于A,在表3中插入具有相同ID和Gar的新行,但Gar_Corr变量等于1a,2a和3a。

我尝试将第一个表与这样的表合并:

Gar Gar_Corr
  A      1a
  A      1b
  A      1c
  B      B
  C      C

但它没有工作,因为我在第一个表中获得的行数与合并后的行数相同。

2 个答案:

答案 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;
相关问题