Сравнить адреса из 2 таблиц с частичными и несоответствующими столбцами - PullRequest
0 голосов
/ 31 января 2019

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

Когда не существует совпадающего номера счета, мне нужно посмотреть на адрес на предмет сходства.

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

Было бы лучше использовать временные таблицы, и если да, то как?

Вот мой код:

- первый cte вытягивает все ненулевые счета и переформатирует номера счетовдля соответствия форматированию номеров счетов во 2-й таблице

WITH Table1_Reformat_AccountNum_CTE
AS
(
  Select 
          t1.account_number
         ,t1.account_name
         ,t1.address_1 
         ,t1.address_2
         ,t1.city
         ,t1.state
         ,t1.zip
         ,CASE
            WHEN t1.account_number LIKE '%xyz-%' THEN LTRIM(RTRIM(RIGHT(t1.account_number, LEN(t1.account_number)-9)))
            WHEN t1.account_number LIKE 'qrs:% -lmo' THEN REPLACE(LTRIM(RTRIM(RIGHT(t1.account_number, LEN(t1.account_number)-5))), '-lmo', '')
            ELSE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(RIGHT(t1.account_number, LEN(t1.account_number)-5), '-', ''), ' ', ''), '.', ''), ',', ''), 'out', ''), '#', ''), '0ut', ''), '''', ''), '_', ''), '*', ''),'<',''),'>',''),'^','')
            END AS account_num_formatted
  From [database_1].[dbo].[sales_table_1] t1
  WHERE t1.account_number IS NOT NULL


)
-- 2nd cte matched reformatted account numbers to account numbers in table 2
,Table2_AccountNum_Matches_CTE
AS
(
SELECT 
          t1.account_num_formatted 
         ,t2.account_number
         ,t2.account_name
         ,t2.address_1 
         ,t2.address_2
         ,t2.city
         ,t2.state
         ,t2.zip

FROM Table1_Reformat_AccountNum_CTE ref
INNER JOIN [database_2].[dbo].[sales_table_2] t2
ON t2.account_number = t1.account_num_formatted 
)
-- 3rd cte finds all left over accounts in table 1 that have no match in table 2

,Table1_Non_Matches_Cte
AS
(
SELECT 
          t1.account_num_formatted
         ,t1.account_name
         ,t1.address_1 
         ,t1.address_2
         ,t1.city
         ,t1.state
         ,t1.zip 
    FROM Table1_Reformat_AccountNum_CTE ref
    WHERE t1.account_num_formatted NOT IN (SELECT acm.account_num_formatted FROM Table2_AccountNum_Matches_CTE acm)
)
-- 3rd cte finds all left over accounts in table 2 that have no match in table 1

,Table2_Non_Matches_Cte
AS
(
SELECT  
          t2.account_number
         ,t2.account_name
         ,t2.address_1 
         ,t2.address_2
         ,t2.city
         ,t2.state
         ,t2.zip
    FROM [database_2].[dbo].[sales_table_2] t2
    WHERE t2.account_number NOT IN (SELECT acm.account_num_formatted FROM Table2_AccountNum_Matches_CTE acm)
)

-- attemtps to find all accounts in table 2 that have no match in account number in table 1 but match on address 

SELECT 
          t1.account_num_formatted
         ,t1.account_name
         ,t1.address_1 
         ,t1.address_2
         ,t1.city
         ,t1.state
         ,t1.zip 
         ,t2.account_number
         ,t2.account_name
         ,t2.address_1 
         ,t2.address_2
         ,t2.city
         ,t2.state
         ,t2.zip
    FROM Table1_Reformat_AccountNum_CTE ref
    FULL OUTER JOIN [database_2].[dbo].[sales_table_2] t2
    ON t1.account_num_formatted = t2.account_number
    WHERE t2.account_number IN (SELECT  non.account_number FROM Table2_Non_Matches_Cte non )
    AND t1.address_1  LIKE '%'+ t2.address_1 +'%'
    AND t1.city  LIKE '%'+ t2.city+'%'
    AND t2.state LIKE '%'+ t2.state+'%'
    AND t2.zip  = '%'+t2.zip+'%'

Пример данных:

Таблица 1

——————
Acc | Name | Add 1| Add 2 | City | State | Zip
————————————————————-
1       store1   113 st lane    mulberry tx   12344
Null   store2   114 st lane    mulberry tx   34254
6       store3   113 st lane    mulberry tx   98764
7       store4   115 st lane    mulberry tx   74631
8.1    store5   116 st lane    mulberry tx   12347

Таблица 2

——————
Acc | Name | Add 1| Add 2 | City | State | Zip
————————————————————-
1       store1   113 st lane   mulberry tx   12344
Null   store2   114 st lane   mulberry tx   34254
9       store8   213 ha ave   juniper    ct   46738
5      store9   217 wa ave  juniper    ct  98376
8     store5   116 st lane    mulberry    tx   12347

ОжидаетсяРезультаты:

Acc | Name | Add 1| Add 2 | City | State | Zip
————————————————————-
1        store1   113 st lane    mulberry tx   12344
Null   store2   114 st lane    mulberry tx   34254
8       store5   116 st lane   mulberry tx   12347
...