Объединение счетов-фактур и отгрузочных записей на основе частичной информации - PullRequest
1 голос
/ 18 октября 2019

Я надеюсь, что это просто тот случай, когда я не знаю терминологию для поиска, но я пока не нашел ни одного намека на то, как ее решить.

Я пытаюсь объединить две таблицы (счета-фактуры)и отгрузочные записи), где часть информации отсутствует. В частности, код счета и номер заказа, который я обычно использовал бы для присоединения.

Учитывая, что каждый заказ довольно уникален по точному сочетанию продуктов и количеств, я надеюсь, что можно присоединиться к таблицам, сравнивсостав заказов.

Например, учитывая приведенные ниже данные, можно определить, что запись об отправке для order_ref A1 связана с invoice_num 500, поскольку она содержит одинаковые продукты в одинаковых количествах.

  shipping_id | order_ref | product | quantity 
 -------------|-----------|---------|---------- 
          100 | A1        | Apple   |        1 
          101 | A1        | Banana  |        1 
          102 | A1        | Carrot  |        2 


  invoice_num | line_num | product | quantity 
 -------------|----------|---------|---------- 
          500 |        1 | Apple   |        1 
          500 |        2 | Banana  |        1 
          500 |        3 | Carrot  |        2 
          501 |        1 | Apple   |       10 
          501 |        2 | Banana  |        1 
          501 |        3 | Carrot  |        2 

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Вы можете создать ключ для каждой группы и присоединиться к нему.

В вашем примере ключ Apple_1_Banana_1_Carrot_2_ создаст для order_ref = "A1" доставки и invoice_num = "500" счета.

DECLARE @shipping TABLE  (shipping_id INT, order_ref VARCHAR(10), product VARCHAR(10), quantity INT)
INSERT INTO @shipping VALUES
(100 , 'A1', 'Apple', 1), 
(101 , 'A1', 'Banana', 1), 
(102 , 'A1', 'Carrot', 2) 

DECLARE @invoice TABLE  (invoice_num INT, line_num INT, product VARCHAR(10), quantity INT)
INSERT INTO @invoice VALUES
(500, 1 ,'Apple',  1 ),
(500, 2 ,'Banana',  1 ),
(500, 3 ,'Carrot',  2 ),
(501, 1 ,'Apple', 10 ),
(501, 2 ,'Banana',  1 ),
(501, 3 ,'Carrot',  2 )

SELECT * FROM (
    SELECT * FROM @shipping s
        CROSS APPLY(SELECT product + '_' + CAST(quantity AS varchar(10)) + '_'  
            FROM @shipping s2 WHERE s.order_ref = s2.order_ref 
            ORDER BY product , quantity FOR XML PATH('')) X(group_key)
) A
INNER JOIN 
    (SELECT * FROM @invoice i
        CROSS APPLY(SELECT product + '_' + CAST(quantity AS varchar(10)) + '_'  
            FROM @invoice i2 WHERE i.invoice_num = i2.invoice_num 
            ORDER BY product , quantity FOR XML PATH('')) X(group_key) 
)B ON A.group_key = B.group_key 
    AND A.product = B.product
    AND A.quantity = B.quantity

Результат:

shipping_id order_ref  product    quantity    line_num             invoice_num line_num    product    quantity   
----------- ---------- ---------- ----------- -------------------- ----------- ----------- ---------- -----------
100         A1         Apple      1           1                    500         1           Apple      1          
101         A1         Banana     1           2                    500         2           Banana     1          
102         A1         Carrot     2           3                    500         3           Carrot     2          
0 голосов
/ 18 октября 2019

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

SELECT order_ref, STRING_AGG(product + quantity, '_') as product_list
FROM
(SELECT * FROM shipping_records ORDER BY product) AS inner_shipping_records
GROUP BY
order_ref

, а затем

SELECT invoice_num, STRING_AGG(product + quantity, '_') as product_list
FROM
(SELECT * FROM invoices ORDER BY product) AS inner_invoices
GROUP BY
invoice_num

и затем сделатьваше объединение в полях product_list:

SELECT * FROM
( SELECT order_ref, STRING_AGG(.... ) as a_products JOIN
( SELECT invoice_num, STRING_AGG(.... ) as a_shipping_records
ON a_products.product_list = a_shipping_records.product_list

Я не проверял это на SQL Server, но оно должно работать. Я не думаю, что это будет быстро, но вы могли бы разработать какой-то функциональный индекс или представления, которые могли бы ускорить это.

0 голосов
/ 18 октября 2019

указывается вместо продукта и количества:

select table_a.*, table_b.* 
from table_a
join table_b on table_a.product = table_b.product
and  table_a.quantity = table_b.quantity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...