SAS SQL:加入和联合组合以填充行

时间:2016-11-01 14:05:15

标签: sql join merge sas union

我实际上是在尝试加入两个变量IDACCOUNTNUMBER。简单。但是,FULL数据集有一行共同的ID但不同的ACCOUNTNUMBER(请注意重命名)和CAR。我想合并这些并让ID保留这些值。请参阅以下示例数据:

DATA FULL;
    LENGTH ID ACCT_FULL CAR $12.;
    INPUT ID $ ACCT_FULL $ CAR $;
    DATALINES;
    A   123 MAZDA
    B   456 FORD
    C   789 CHEVY
    D   777 NISSAN
    ;
RUN;

DATA SUBSET;
    LENGTH ID ACCOUNTNUMBER $12.;
    INPUT ID $ ACCOUNTNUMBER $;
    DATALINES;
    A   123
    B   456
    C   789
    D   012
    ;
RUN;

** THIS QUERY DOES NOT QUITE OUTPUT A DATASET I WANT **;
PROC SQL NOPRINT;
    CREATE TABLE WANT_BAD AS
    SELECT *
    FROM SUBSET AS A
    LEFT JOIN
    FULL(RENAME=(ACCT_FULL=ACCOUNTNUMBER)) AS B
    ON      A.ID = B.ID AND 
            A.ACCOUNTNUMBER = B.ACCOUNTNUMBER;
QUIT;

以下是我目前所拥有的与我想要的内容的并列比较:

Bad Output:      Want Output:

A   123 MAZDA   |   A   123 MAZDA
B   456 FORD    |   B   456 FORD
C   789 CHEVY   |   C   789 CHEVY
D   012         |   D   012 NISSAN
                |   D   777 NISSAN

我的问题是 - 我可以在查询中添加某种UNION语句来输出我想要的数据吗?我想在SQL而不是数据步骤中执行此操作,因为现实生活中的FULL数据量很大,我不想使用IN=语句读入,排序和合并,因为它会需要更长时间。

2 个答案:

答案 0 :(得分:0)

这很奇怪,因为即使在没有匹配帐号的行上也要查找car

因此,一种方法是union对所有id / accountnumber对一起获取所有行。然后将car信息带回来:

proc sql:
    select fs.id, fs.accountnumber, f.car
    from ((select f.id, f.accountnumber from full f) union
          (select s.id, s.acct_full from subset s)
         ) fs left join
         full f
         on f.id = fs.id;

答案 1 :(得分:0)

我想出了一些SQL代码,它与您提供的玩具数据一起使用,似乎可以提供您想要的结果。这将执行两个INNER JOINS - 第一个使用来自" FULL"的ID。第二次加入使用来自" SUBSET"的ID。 - 在两个INNER JOINS之间有一个UNION。我不认为这段代码是有效的,但我无法想到任何其他方法来实现这一点。使用您的数据样本进行测试,看它是否按照您想要的方式工作。

PROC SQL NOPRINT;

    /* THIS INNER JOIN MATCHES BY ID ONLY */
    /* CREATES NEWACCT USING ACCOUNT NUMBER FROM "FULL" */
    CREATE TABLE TRY_AGAIN AS

    SELECT A.*, B.*,  
        B.ACCT_FULL AS NEWACCT
    FROM SUBSET AS A
    INNER JOIN 
    FULL  AS B
    ON A.ID = B.ID 

    UNION

    /* THIS INNER JOIN MATCHES BY ID AND AND ACCOUNT NUMBER */
    /* KEEPS ONLY IF ACCOUNT NUMBERS DO NOT MATCH */
    /* CREATES NEWACCT USING THE ACCOUNT NUMBER FROM "SUBSET" */
    SELECT A.*, B.*,  
         A.ACCOUNTNUMBER AS NEWACCT 
    FROM SUBSET AS A
    INNER JOIN 
    FULL  AS B
    ON      A.ID = B.ID AND 
            A.ACCOUNTNUMBER NOT= B.ACCT_FULL

    ORDER BY ID, NEWACCT
;

QUIT;