Как мне достичь объединения / слияния таблиц с этими условиями? - PullRequest
0 голосов
/ 06 декабря 2018

Прежде всего, я разработчик 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 (например, 5 и 6 в таблице B).

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и присоединяйся в некотором роде к каждому.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы можете использовать объединение с несколькими пустыми строками:

ВЫБРАТЬ A.ca_no, A.ca_name, A.assetnm, A.power, A.period, B.kickoffdate, B.carbrandИЗ ЛЕВОГО СОЕДИНЕНИЯ B ВКЛ A.ca_no = B.ca_no <- Этот запрос возвращает все результаты A с совпадениями B. </p>

ВЫБРАТЬ B.ca_no, B.ca_name, B.assetnm, '' power power, B.period, B.kickoffdate, B.carbrand ОТ B ВЛЕВО ПРИСОЕДИНЯЕТСЯ К B.ca_no = A.ca_no ГДЕ A.ca_no IS NULL <- Этот запрос возвращает результаты B, а не в A. </p>

Теперь вам нужно только преобразовать этот запрос в UNION, добавив UNION перед вторым запросом.

Если вам нужно отсортировать результаты, вы можете сделать это во вложенном запросе и сократить егопотом.Пример:

SELECT * FROM (

SELECT A.ca_no, A.ca_name, A.assetnm, A.power, A.period, B.kickoffdate, B.carbrand FROMA LEFT JOIN B ON A.ca_no = B.ca_no

UNION SELECT B.ca_no, B.ca_name, B.assetnm, '' Мощность AS, B.period, B.kickoffdate, B.carbrand ОТ BСЛЕДУЕТ ПРИСОЕДИНЯТЬСЯ К B.ca_no = A.ca_no ГДЕ A.ca_no НЕДЕЙСТВИТЕЛЕН

) КАК ПРОИЗВОДИТСЯ ORDER BY ca_no

Я написал запрос, не проверяя его, возможно, ониможет быть опечаткой, но именно так вы можете достичь своих потребностей.

0 голосов
/ 06 декабря 2018

Это можно сделать за очень простой шаг данных.Не пытаясь быть грубым, кажется, что 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;
0 голосов
/ 06 декабря 2018

Вы можете попробовать это с полным внешним соединением вместе с 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...