2017-01-10 5 views
0

В моем исходном коде, я хочу, чтобы объединить несколько баз данных:условного объединения SAS PROC SQL

%let theft=1; 

proc sql; 
create table NewTable as 
Select * 

From 
    dtm_sitecom.FactSitecAllCriteria SITEC 

left join dtm_sitecom.FactClaimLastVersion FactClaimLastVersion 
    on FactClaimLastVersion.ClaimId = Sitec.ClaimId 

/*Condition 1 here*/ 
/*If &Theft=1 then*/ 
left join dtm_sitecom.DimClaimState DimClaimState 
    on DimClaimState.ClaimStateKey = FactClaimLastVersion.ClaimStateKey 

/*Condition 2 here*/ 
/*else if &Theft = 0 then*/ 
left JOIN dtm_sitecom.DimGeoRisk dgr 
    ON dgr.GeoRiskKey = SITEC.GeoRiskKey; 
quit; 

На обновленной версии, я хочу, чтобы добавить некоторые условия (/ Условие 1/и/Состояние 2/в коде), например, если значение переменной Theft=1 затем выполняет слияние с талбе dtm_sitecom.DimClaimState, в противном случае слияние с другой таблицей. Я пробовал код, как если бы не был знак комментария вокруг if, но он не работал из-за неправильного синтаксиса. Есть ли синтаксис SAS, позволяющий мне это сделать?

+0

Дайте нам пример того, что вы пытаетесь сделать. Условие 'on' * является * условием, поэтому какое условие вы пытаетесь добавить, что там не будет работать? – Joe

+0

@Joe: Я отредактировал вопрос, извините, если это было непонятно. – Metariat

+0

Если 'theft = 0' могли ли вы иметь успешные совпадения в' DimClaimState'? Или они будут только соответствовать, когда 'theft = 1'? – Joe

ответ

2

Если вы присоединяетесь на переменную в данных, вы можете включить, что в on заявлении:

data class_attach_m; 
    set sashelp.class; 
    attach_var='M'; 
run; 

data class_attach_f; 
    set sashelp.class; 
    attach_var='F'; 
run; 

proc sql; 
    create table class as 
    select class.*, coalescec(class_attach_m.attach_var,class_attach_f.attach_var) as attach_var from sashelp.class 
    left join class_attach_m 
    on class.name = class_attach_m.name 
     and class.sex='M' 
    left join class_attach_f 
    on class.name = class_attach_f.name 
     and class.sex='F' 
    ; 
quit; 

coalescec (или coalesce для числовых значений) сочетает в себе две принесенные-в поля.

Если вы используете макропеременные, чтобы управлять тем, что вы запускаете, вы должны запускать это в макросе; если вы находитесь в макроконтексте, вы можете использовать %if для управления выполняемым.

Например, используя предыдущий пример - и я использую макрос параметр не %let, как это правильный способ сделать это, если вы можете определить, что параметр, используя %let ранее, и использовать его для вызова параметра:

%macro attach_which(attach_m=M); 

proc sql; 
    create table class as 
    select class.*, attach_var from sashelp.class 
    %if &attach_m=M %then %do; 
     left join class_attach_m 
     on class.name = class_attach_m.name 
    %end; 
    %else %do; 
     left join class_attach_f 
     on class.name = class_attach_f.name 
    %end; 
    ; 
quit; 
%mend attach_which; 

%attach_which(attach_m=M); 
+0

Фактически вы ответили отлично на мой вопрос. Кроме того, во второй части вашего ответа, проверяет ли код условия при каждом наблюдении? Если да, есть ли более быстрый способ сделать это? – Metariat

+0

Нет, выполнение макросов происходит до того, как произойдет обработка данных. Макрос записывает код SQL, а затем этот завершенный код SQL отправляется интерпретатору SQL. – Joe