2017-02-24 41 views
0

我有兩個表需要加入。這些表只共享1個共同的字段(ID,並且不是唯一的)。是否有可能將這兩個表連接起來,但使其具有唯一性,並將所有匹配的數據保存在一行中?SAS SQL:與2個表的多對多關係但不想多個行

例如,我有兩個表如下:

+-------+----------+ 
| ID | NAME | 
+-------+----------+ 
| A  | Jack  | 
| A  | Andy  | 
| A  | Steve | 
| A  | Jay  | 
| B  | Chris | 
| B  | Vicky | 
| B  | Emma  | 
+-------+----------+ 

而這僅僅是由ID列相關的另一個表:

+-------+--------+ 
| ID  | Age | 
+-------+--------+ 
| A  |  22 | 
| A  |  31 | 
| A  |  11 | 
| B  |  40 | 
| B  |  17 | 
| B  |  20 | 
| B  |  3 | 
| B  |  65 | 
+-------+--------+ 

最終的結果我想得到的是:

+-------+----------+++-------+ 
| ID | NAME | Age | 
+-------+----------++-------+- 
| A  | Jack  | 22 | 
| A  | Andy  | 31 | 
| A  | Steve | 11 | 
| A  | Jay  | null | 
| B  | Chris | 40 | 
| B  | Vicky | 17 | 
| B  | Emma  | 20 | 
| B  | null  | 3 | 
| B  | null  | 65 | 
+-------+----------+++-------+ 
+0

不,這是不可能的。 SQL代表*無序集合 - 無需訂購,有*無*保證訂單將相同。因此,不可能始終如一地讓這些年齡與用戶順序相匹配。 – Siyual

回答

2

這是數據步合併的默認行爲,但它不會將最後一排的variabl e失蹤 - 但很容易做到。

還有其他的方法可以做到這一點,如果你對此感到滿意,我認爲最好的是散列對象。

data names; 
infile datalines dlm='|'; 
input ID $ NAME $; 
datalines; 
| A  | Jack  | 
| A  | Andy  | 
| A  | Steve | 
| A  | Jay  | 
| B  | Chris | 
| B  | Vicky | 
| B  | Emma  | 
;;;; 
run; 

data ages; 
infile datalines dlm='|'; 
input id $ age; 
datalines; 
| A  |  22 | 
| A  |  31 | 
| A  |  11 | 
| B  |  40 | 
| B  |  17 | 
| B  |  20 | 
| B  |  3 | 
| B  |  65 | 
;;;; 
run; 


data want; 
    merge names(in=_a) ages(in=_b); 
    by id; 
    if _a; 
    if name ne lag(name) then output; *this assumes `name` is unique in id - if it is not we may have to do a bit more work here; 
    call missing(age); *clear age after output so we do not attempt to fill extra rows with the same age - age will be 'retain'ed; 
run; 
+0

謝謝,喬!我正在處理一個大的CRMS數據庫,並且不可能像您演示的那樣輸入原始數據。我正在使用不支持「分區依據」功能的SAS SQL。我知道「連接」功能不起作用,因爲它會增加行數。只是補充一點,「名稱」也不是唯一的。你有其他建議嗎?非常感謝! – user7618633

+0

如果您使用'PROC SQL'並使用本地SAS代碼(而不是直通),那麼您可以像我一樣編寫一個數據步驟(跳過前兩個數據步驟,我只是爲該示例輸入數據) 。 (如果你正在使用pass,那麼分區可能是可用的。) – Joe

+1

實際上,如果你有與該數據庫的libname連接,就像'merge yourlib.names(in = _a)yourlib.ages在= _b);通過id;'和其他 - 它會自動拉取'id'命令的數據,所以你不需要對數據或類似的東西進行排序。 – Joe