SQL Динамическое объединение таблиц в разных столбцах - PullRequest
1 голос
/ 21 февраля 2020

Первая публикация!

Имеется сценарий использования, в котором мы хотим объединить некоторые данные о продажах в таблицу генерального соглашения для определения применимых комиссий на уровне транзакций.

Сложная часть заключается в том, что таблица соглашений имеет РАЗЛИЧНЫЕ возможности, и в худшем случае, по крайней мере, «поймать все».

Мы хотели бы начать с самого «гранулярного» уровня. Таким образом, фиолетовая линия соответствует всем возможным значениям. Однако такое поле, как синяя запись о продажах, не совпадает ни по одному значению с основным, кроме поставщика, поэтому в этом случае это все подхват.

enter image description here

Я думал о том, чтобы объединить все строки в мастере, но тогда мне нужно было бы найти способ присоединить его к продажам - простой concat не смог бы успешно соединить пример с синей строкой. Объединение должно было бы динамически выбирать, какие столбцы сравнивать.

Случайно ли у кого-нибудь есть идеи, как этого добиться? Спасибо!

(Код для таблиц)

* 10 19 * создать TABLE T_TEST_AGREEMENT (VARCHAR ПОСТАВЩИКА (254), VARCHAR ПУНКТА (254), ПРОГРАММА INT, VARCHAR RXDA (254), CTRCT INT, INT FEE INT);

создать TABLE T_TEST_AGREEMENT_SALES (SUPPLIER 25) ПУНКТ VARCHAR (254), ПРОГРАММА INT, RXDA VARCHAR (254), CTRCT INT);

INSERT INTO T_TEST_AGREEMENT значения (123, «A», 60, «Y», 4, 1), (123, «A», 61, «N», 4, 2), (123, «B», 62, null, 5, 3), (123, «C», null, «Y», 6, 4) , (123, ноль, 63, ноль, ноль, 5), (123, ноль, ноль, 'Y', ноль, 6), (123, ноль, ноль, ноль, ноль, 7);

INSERT INTO T_TEST_AGREEMENT_SALES значения (123, «D», 63, ноль, ноль), (123, «F», ноль, ноль, ноль), (123, «A», 61, «N», 4), ( 123, 'C', ноль, 'Y', 6);

1 Ответ

0 голосов
/ 21 февраля 2020

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

select st.*,
       (select m.fee
        from master m
        where m.supplier = st.supplier and
              (m.item is null or m.item = st.item) and
              (m.program is null or m.program = st.program) and
              (m.rxda is null or m.rxda = st.rxda) and
              (m.ctrct is null or m.ctrct = st.ctrct)
        order by ( (case when m.item = st.item then 1 else 0 end) +
                   (case when m.program = st.program then 1 else 0 end) +
                   (case when m.rxda = st.rxda then 1 else 0 end) +
                   (case when m.ctrct = st.ctrct then 1 else 0 end) +
                 ) desc
        fetch first 1 row only
       ) as fee               
from sales_transactions st;

Используется стандартный синтаксис SQL. Это может варьироваться в зависимости от вашей строки.

...