SQL Левое соединение разных столбцов с учетом указанных c условий - PullRequest
0 голосов
/ 11 июля 2020

Я считаю, что это простой. Только начинаю работать с SQL, так что я нахожу это немного сложным. Итак, я использую SQL в SAS, и я хочу объединить две таблицы, но в разных столбцах на основе значения столбца. Практический пример:

Proc sql;
create table new_table_name as select 
a.proposal_code as new_name_proposal_code,
a.1st_client_code as new_name_1st_client_code,
a.2nd_client_code as new_name_2nd_client_code,
a.3rd_client_code as new_name_3rd_client_code,
a.4th_client_code as new_name_4th_client_code,
a.product_type as new_name_product_type,
b.2nd_client_code
from existing_table a
left join existing table b (on b.2nd_client_code=a.2nd_client_code and a.product_type = "clothes") or 
left join existing table b (on b.2nd_client_code=a.3rd_client_code and (a.product_type = "cars" or a.product_type = "bikes"));
quit;

Итак, это код, который я использую в настоящий момент, и цель состоит в том, чтобы объединить таблицу a и таблицу b, используя b. 2-й клиентский код = a 2-й клиентский код, если тип продукта из таблицы a = "одежда", и если тип продукта из таблицы a - "автомобили" или "велосипеды", соедините таблицу a и таблицу b, используя b.2nd client code = a.3rd client code. По сути, посмотрите на два разных «вклада», касающихся конкретного типа продукта c. При объединении этих двух таблиц, если в одной строке указан тип продукта «одежда», я хочу, чтобы он смотрел на второй клиентский код, если это либо «автомобили», либо «велосипеды», посмотрите на третий клиентский код.

Надеюсь, я прояснил это. Ошибка, которую я получаю в данный момент, - "ожидание включения". Это проблема синтаксиса?

Ответы [ 2 ]

3 голосов
/ 11 июля 2020

Да. Скобки перед on неверны. У вашего запроса есть и другие проблемы. Я думаю, вы хотите:

create table new_table_name as
    select a.proposal_code as new_name_proposal_code,
           a.1st_client_code as new_name_1st_client_code,
           a.2nd_client_code as new_name_2nd_client_code,
           a.3rd_client_code as new_name_3rd_client_code,
           a.4th_client_code as new_name_4th_client_code,
           a.product_type as new_name_product_type,
           coalsesce(bc.2nd_client_code, bcb.2nd_client_code)
    from existing_table a left join
         existing_table bc
         on bc.2nd_client_code = a.2nd_client_code and
            a.product_type = 'clothes' left join 
         existing_table bcb
         on bcb.2nd_client_code = a.3rd_client_code and
            a.product_type in ('cars', 'bikes');

Примечания:

  • Без скобок перед предложением on.
  • Нет or left join . or - логический оператор. left join - оператор над наборами (т.е. таблицами и наборами результатов). Не смешивать.
  • Нет повторяющихся псевдонимов таблиц.
  • Вы хотите объединить два кода, поэтому вам нужно что-то вроде coalesce() в select.
  • Разделитель SQL для строк - это одинарная кавычка, а не двойная кавычка.
  • in проще, чем строка из or условий.
1 голос
/ 12 июля 2020

Похоже, вам просто нужен комплексный критерий ON, а не два соединения. Примерно так:

proc sql;
create table new_table_name as 
select 
   a.proposal_code as new_name_proposal_code
  ,a.client_code1 as new_name_client_code1
  ,a.client_code2 as new_name_client_code2
  ,a.client_code3 as new_name_client_code3
  ,a.client_code4 as new_name_client_code4
  ,a.product_type as new_name_product_type
  ,b.client_code2 as new_name_other_client_code2
from tableA a
left join tableB b
  on (b.client_code2=a.client_code2 and a.product_type = "clothes")
  or (b.client_code2=a.client_code3 and a.product_type in ("cars","bikes"))
;
quit;

Для лучшего ответа отправьте пример ввода и желаемый результат.

...