SQL является идеальным инструментом для объединения этих таблиц, поскольку он является наиболее гибким при объединении данных.
Использование тестовых данных DomPazz;
data taxes;
informat state $8.
city $12.
Good $12.
tax best.;
input state $ city $ good $ tax;
datalines;
all all all 0.07
all all chicken 0.04
all jackson all 0.01
arizona all meat 0.02
arizona phoenix meat 0.04
arizona tucson meat 0.03
hawaii all all 0.08
hawaii all chicken 0.11
nevada reno cigar 0.11
nevada vegas cigar 0.13
;;;
run;
data to_look_up;
informat lu_state $8.
lu_city $12.
lu_Good $12. ;
input lu_state $ lu_city $ lu_good $;
datalines;
nevada reno cigar
nevada reno chicken
hawaii honalulu chicken
texas dallas steak
;;;
run;
Приведенный ниже запрос соединяет каждую строку в таблице to_look_up со строками в таблице налогов, где; штат соответствует или штат равен «всем» в таблице налогов, город соответствует или город равен «всем» в таблице налогов, а хорошие совпадения или хорошо равны «всем» в таблице налогов.
Это может привести к тому, что более 1 строки в таблице налогов будут соответствовать строке в таблице to_look_up. Хотя мы можем выбрать наилучшее совпадение, установив приоритет совпадений, т. Е. Состояние совпадения перед состоянием равно «все», и то же самое для города и добра.
Предложение Group By здесь важно. Это должна быть уникальная комбинация переменных в таблице to_look_up. При этом мы можем выбрать лучшее совпадение для каждой строки в таблице to_look_up и исключить все остальные совпадения.
proc sql;
create table taxes_applied as
select *
/* Prioritise state, city and good matches. */
, case when to_look_up.lu_state eq taxes.state then 2
when 'all' eq taxes.state then 1
end as match_state
, case when to_look_up.lu_city eq taxes.city then 2
when 'all' eq taxes.city then 1
end as match_city
, case when to_look_up.lu_good eq taxes.good then 2
when 'all' eq taxes.good then 1
end as match_good
from to_look_up
/* join taxes table on matching state, city and good or matching 'all' rows. */
left join
taxes
on ( to_look_up.lu_state eq taxes.state
or 'all' eq taxes.state
)
and ( to_look_up.lu_city eq taxes.city
or 'all' eq taxes.city
)
and ( to_look_up.lu_good eq taxes.good
or 'all' eq taxes.good
)
/* Process for each row in to_look_up table. */
group by to_look_up.lu_state
, to_look_up.lu_city
, to_look_up.lu_good
/* Select best match. */
having match_state eq max (match_state)
and match_city eq max (match_city)
and match_good eq max (match_good)
order by to_look_up.lu_state
, to_look_up.lu_city
, to_look_up.lu_good
, match_state
, match_city
, match_good
;
quit;
Соединения, подобные этому, можно использовать для создания промежуточных итогов в сводных таблицах.
person
Chris
schedule
12.09.2014