Как найти различия между двумя таблицами с одинаковыми столбцами, но разными значениями? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть две таблицы с данными клиентов, обе с одинаковыми столбцами и одинаковыми идентификаторами клиентов.

Обе таблицы были извлечены из базы данных с интервалом в 3 месяца между ними, поэтому я ожидаю, что некоторые значения столбцы будут изменены для некоторых клиентов.

Схема таблицы выглядит так:

customerID | location | phone | address 

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

Как мне написать сценарий SQL, который может обнаруживать эти изменения и подсчитывать их, чтобы я мог лучше визуализировать их?

Пока у меня есть:

with t1 as (
    select distinct customerID
        , phone
    from table1
),
t2 as (
    select distinct a.customerID
        , b.phone
    from table1 a 
    left join table2 b on a.customerID = b.customerID
)
select customerID, phone
from t1
except
select customerID, phone
from t2

Я не уверен, что это правильный logi c, если бы кто-то мог придумать более эффективное решение.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Я плохо понимаю ваш код, особенно при использовании cte. Но вы можете использовать оператор EXCEPT, чтобы найти значения (phone и et c) в Table1, который не находится в Table2 (или наоборот - просто поменяйте местами Table1 и Table2 в блоках EXCEPT). Есть 3 блока (кроме), потому что вы хотите знать, подсчитайте каждый тип различий (телефон, местоположение, адрес). После получения отсутствующих значений просто используйте SUM + UNION для получения значений в одной строке (для каждого customer_id). Кроме того, если будет значение NULL, я использую оператор coalesce, чтобы заменить его пустой строкой

select
CustomerId,
SUM (CASE WHEN TypeDifference='DiffPhone' THEN 1 ELSE 0 END)CountDiffPhone,
SUM (CASE WHEN TypeDifference='DiffLocation' THEN 1 ELSE 0 END)CountDiffLocation,
SUM (CASE WHEN TypeDifference='DiffAddress' THEN 1 ELSE 0 END)CountDiffAddress
FROM
(
select CustomerId,  'DiffPhone' As TypeDifference from
  (
    select CustomerId,COALESCE(phone,'')phone from Table1
    except
    select CustomerId,COALESCE(phone,'') from Table2
  ) X 

UNION ALL

select customerID,'DiffLocation' from 
  (
    select customerID,COALESCE(location,'')location from Table1
    except
    select customerID,COALESCE(location,'') from Table2
   ) Y 

UNION ALL

select customerID,'DiffAddress' from 
(
   select customerID,COALESCE(address,'')location from Table1
   except
   select customerID,COALESCE(address,'') from Table2
) Z

)
T
GROUP BY CustomerId
0 голосов
/ 06 августа 2020

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

SELECT a.[cust_id]
,sum((case when trim(a.phone) <> trim(b.phone) then 1 else 0 end)) 
 count_of_phone_changes
,sum((case when trim(a.[Location]) <> trim(b.[location]) then 1 else 0 end)) 
count_of_location_changes
,sum((Case when trim(a.[address]) <> trim(b.[address]) then 1 else 0 end)) 
count_of_address_changes
 FROM [dbo].[Table_1] a
left join [dbo].[Table_2] b on
a.cust_id = b.cust_id
group by a.cust_id

[1]: https://i.stack.imgur.com/2nPiD.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...