#mysql #sas
Вопрос:
Итак, у меня есть две таблицы, которые я использую для создания третьей таблицы. Таблица A содержит столбцы A, B, C, D и от 1 до 100; представьте список страховых требований и их коды для выставления счетов. В таблице B есть столбцы E, F, G, H и от 1 до 100 (некоторые столбцы от 1 до 100 отсутствуют); представьте список коэффициентов по страховым случаям и их верхние коды корректировки. Таким образом, таблица A всегда содержит столбцы A, B, C, D и от 1 до 100, а таблица B всегда содержит столбцы E, F, G, H, но может содержать любое разнообразие столбцов от 1 до 100, т. Е. некоторые отсутствующие столбцы в 1-100.
Я должен объединить эти таблицы и построить некоторые сводные значения следующим образом:
Proc Sql; Create table C as Select a.A, a.B, a.C, a.D, abs(a.1 x b.1 a.2 x b.2 a.3 x b.3 .... a.100 x b.100 a.D x b.E b.F) x a.C as Expected_Ratio from A as a, B as b;
Из-за объема столбцов я включаю все a.i x b.i в код. Но если b.i не существует, очевидно, происходят ошибки.
Так что, скажем, в этом месяце у меня есть значения от 1 до 100, но в B отсутствуют 17, 37, 57 и 89; Я запускаю код и получаю ошибки для отсутствующих значений 17, 37, 57 и 89, которые я затем комментирую. Затем я повторяю запуск и получаю желаемый результат. Это приводит к тому, что много времени уходит на просмотр журнала в поисках значений, которые исключают ошибки, а затем комментируют отсутствующие значения. И это необходимо делать каждый раз при запуске кода.
Есть ли какой-либо способ автоматизировать функцию сводки, чтобы избежать ошибок? Или способ обработки ошибок, чтобы код мог игнорировать a.i x b.i, когда столбца i нет в таблице b? Если бы отсутствующие значения были объектами в любой из таблиц, я знаю, что мог бы выполнить вложенный запрос «где a.* в (выберите b.* из b)», но поскольку это столбцы, я не знаю, как обрабатывать предложение select.
Мне в основном просто нужен способ выразить сумму произведений а.и.и В. И., но только если я существую как в а, так и в…
Комментарии:
1. Я думаю, что вы в основном хотите сказать, что база данных была плохо спроектирована. Можно ли это исправить?
2. Похоже, вы просто хотите использовать функцию SAS SUM(,) вместо оператора сложения. Это позволит игнорировать недостающие значения при формировании итога.
3. Покажите некоторые примеры данных. Я думаю, что массивы и шаг данных будут работать для вас лучше, чем SQL.
4. Я не уверен, что следую комментарию «плохо продуманный». В принципе, в заявках с объявлениями у нас есть все возможные коды, но в заявках с верхней корректировкой у нас конечное число кодов. Я хочу сопоставить выставленные коды с скорректированными кодами, чтобы получить коэффициент. Я не думаю, что это имеет какое-либо отношение к плохим построениям данных, просто так оно и есть…
5. Вам не нужно делиться РЕАЛЬНЫМИ данными. Просто любые данные, которые демонстрируют вашу проблему. Например, нет необходимости включать более двух или трех переменных, чтобы продемонстрировать проблему, которая может быть расширена до 100 или более переменных.
Ответ №1:
Если вы хотите сопоставить значения по «номеру столбца», тогда было бы намного проще иметь данные в ВЫСОКОМ формате, где «номер столбца» — это фактическая переменная, которую можно использовать для сопоставления вместо ИМЕНИ переменной.
data A; input A B C D column value ; cards; 1 2 3 4 1 100 1 2 3 5 2 80 ; data B; input E F column multiplier ; cards; 5 6 1 .50 5 6 2 .25 5 6 3 .15 ; proc sql ; create table want as select a.A,a.B,a.C,a.D , abs(sum( sum(a.value*b.multiplier) , a.D*b.E, b.F)) as Expected_Ratio from A a left join B b on a.column = b.column group by a.A,a.B,a.C,a.D ; quit;
Результат
Expected_ Obs A B C D Ratio 1 1 2 3 4 76 2 1 2 3 5 51
Вы можете использовать PROC TRANSPOSE для преобразования из вашего «ШИРОКОГО» формата в этот «ВЫСОКИЙ» формат. Просто убедитесь, что у вас есть ключевые переменные, которые однозначно идентифицируют строки в A и B, которые вы можете использовать в операторе BY для ТРАНСПОНИРОВАНИЯ процесса.