如何在这些条件下实现表联接/合并?

时间:2018-12-06 03:41:26

标签: sql sas

首先,我是SAS开发人员。因此,在这种情况下,可以使用SAS Datastep或PROC SQL(普通SQL)。

我目前有2个表,其结构如下: ca_no是唯一的

Table A(Master/Primary)    
ca_no   ca_name   assetnm    power     period
1       ali       house      100       201801
2       abu       plane      200       201801
3       abu       plane      300       201802
4       zara      car        400       201801
7       zara      car        500       201805
8       zara      car        600       201806


Table B(Secondary)
ca_no   ca_name   assetnm    period     kickoffdate    carbrand
1       ali       house      201801     1-1-2018       BMW
2       abu       plane      201801     2-1-2018       Audi
5       bernard   tank       201802     3-1-2018       Merc
6       chris     NA         201803     5-2-2018       Ford

我想合并那些可以匹配ca_no的内容。否则,请为没有匹配的ca_no(例如表B中的5和6)的那些连接并创建新记录。

sample output:
Table Result
ca_no    ca_name    assetnm    power    period    kickoffdate    carbrand
1        ali        house      100      201801    1-1-2018       BMW
2        abu        plane      200      201801    2-1-2018       Audi
3        abu        plane      300      201802    3-1-2018       Audi
4        zara       car        400      201801    
5        bernard    tank                201802    3-1-2018       Merc
6        chris      NA                  201803    5-2-2018       Ford
7        zara       car        500      201805    
8        zara       car        600      201806

有办法吗?

分别以某种方式类似于UNION和JOIN。

3 个答案:

答案 0 :(得分:2)

这可以通过简单的数据步骤完成。在不失礼貌的情况下,对于SAS开发人员来说,这似乎是一个非常基本的问题。我认为您目前对该软件还不熟悉。

data A;
input ca_no   ca_name $  assetnm $   power     period;
datalines;
1       ali       house      100       201801
2       abu       plane      200       201801
3       abu       plane      300       201802
4       zara      car        400       201801
7       zara      car        500       201805
8       zara      car        600       201806
;
run;

data B;
input ca_no   ca_name $  assetnm $   period     kickoffdate :ddmmyy8.    carbrand $;
format kickoffdate :ddmmyy8.;
datalines;
1       ali       house      201801     1-1-2018       BMW
2       abu       plane      201801     2-1-2018       Audi
5       bernard   tank       201802     3-1-2018       Merc
6       chris     NA         201803     5-2-2018       Ford
;
run;

data want;
merge A (in=a) B (in=b);
by ca_no;
if a or b;
run;

答案 1 :(得分:1)

您可以使用完全外部联接 coalesce 函数来尝试使用

select coalesce(a.ca_no,b.ca_no), coalesce(a.ca_name,b.ca_name),
coalesce(a.assetnm,b.assetnm),a.power, 
coalesce(a.period,b.period), b.kickoffdate,b.carbrand 
from Table_A a full join Table_B b on a.ca_no=b.ca_no;

答案 2 :(得分:0)

您可以使用带有一些空行的联合:

  

选择A.ca_no,A.ca_name,A.assetnm,A.power,A.period,   B.kickoffdate,B.carbrand从A.ca_no上的左联接B = B.ca_no <-   此查询将为您提供所有A个匹配B个结果。

     

选择B.ca_no,B.ca_name,B.assetnm,''AS电源,B.period,   B.kickoffdate,B.carbrand从B左加入A B.ca_no = A.ca_no   A.ca_no IS NULL <-此查询使您获得B不在A中的结果。

现在,您只需要在一个UNION上转换此查询,在第二个查询之前添加UNION。

如果需要对结果进行排序,则可以在嵌套查询中进行处理,并在以后进行简短处理。示例:

  

选择*从(

     

选择A.ca_no,A.ca_name,A.assetnm,A.power,A.period,   B.kickoffdate,B.carbrand来自A.ca_no = B.ca_no的左联接B

     

UNION SELECT B.ca_no,B.ca_name,B.assetnm,''AS power,B.period,   B.kickoffdate,B.carbrand从B左加入A B.ca_no = A.ca_no   A.ca_no IS NULL

     

)AS DerivedTbl1 OR BY BY ca_no

我在编写查询时没有进行测试,也许它们可能是拼写错误,但这就是您可以满足需求的方式。