I am trying to compare two tables. The way our program works is that if a person was changed, it updates the record and also throws the original data into a new table.
I was able to create a query that works. However, it just returns the row(s) that have changed. Somehow I need it to return both the old and the new, and point out what changed. Is there a way to do that?
So in this example, throwing another thing in there (sorry) Jon Doe should not show up, because nothing really changed. One of his phone numbers got moved from one phone field to another. There are so many like this and my new version still isn't handling them properly.
Jane should show up because her email changed. However it's just returning that record. I can't see what changed, or what the original value is.
Either way it has to say something like this. (I'll skip the details) but in some format so they can see what changed.
BEFORE AFTER CHANGED
Name: Jane Smith Jane Smith
Address: 111 East Grove 111 East Grove
Etc.
Email: janeR@gmail.com janes@gmail.com Yes
ETA Changes from Conrad (Thanks)
CREATE TABLE #Source
(
ID varchar(50), nameFull varchar(50), salutation varchar(50), nameFirst varchar(50), nameLast varchar(50), addressLine1 varchar(50),
addressLine2 varchar(50), addressCity varchar(50), addressState varchar(50), addressZip varchar(50),
phone1full varchar(50), phone2full varchar(50), phone3full varchar(50), phone4full varchar(50), phone5full varchar(50), email1 varchar(50)
)
CREATE TABLE #Target
(pov_Prospect varchar(50),
pov_nameFull varchar(50), pov_salutation varchar(50), pov_nameFirst varchar(50), pov_nameLast varchar(50),
pov_addressLine1 varchar(50), pov_addressLine2 varchar(50), pov_addressCity varchar(50), pov_addressState varchar(50), pov_addressZip varchar(50),
pov_phone1full varchar(50), pov_phone2full varchar(50), pov_phone3full varchar(50), pov_phone4full varchar(50), pov_phone5full varchar(50), pov_email1 varchar(50)
)
-- Jon
INSERT INTO #Source (ID, nameFull, salutation, nameFirst, nameLast, addressLine1, addressLine2, addressCity, addressState, addressZip,
phone1full, phone2full, phone3full, phone4full, phone5full, email1)
VALUES ('1', 'Jon Doe', 'Jon', 'Jon', 'Doe', '1234 West Elm', NULL, 'Chicago', 'IL', '45880',
'1112223333', NULL, '4445556666', NULL, NULL, 'jond@gmail.com');
INSERT INTO #Target
(pov_Prospect, pov_nameFull, pov_salutation, pov_nameFirst, pov_nameLast,
pov_addressLine1, pov_addressLine2, pov_addressCity, pov_addressState, pov_addressZip,
pov_phone1full, pov_phone2full, pov_phone3full, pov_phone4full, pov_phone5full, pov_email1)
VALUES ('1', 'Jon Doe', 'Jon', 'Jon', 'Doe', '1234 West Elm', NULL, 'Chicago', 'IL', '45880',
'1112223333', '4445556666', NULL, NULL, NULL, 'jond@gmail.com');
--Jane
INSERT INTO #Source (ID, nameFull, salutation, nameFirst, nameLast, addressLine1, addressLine2, addressCity, addressState, addressZip,
phone1full, phone2full, phone3full, phone4full, phone5full, email1)
VALUES ('2', 'Jane Smith', 'Jane', 'Jane', 'Smith', '111 East Grove', 'Suite 101', 'Denver', 'CO', '75365',
'8882223333', NULL, NULL, NULL, NULL, 'janes@gmail.com');
INSERT INTO #Target (pov_Prospect, pov_nameFull, pov_salutation, pov_nameFirst, pov_nameLast,
pov_addressLine1, pov_addressLine2, pov_addressCity, pov_addressState, pov_addressZip,
pov_phone1full, pov_phone2full, pov_phone3full, pov_phone4full, pov_phone5full, pov_email1)
VALUES ('2', 'Jane Smith', 'Jane', 'Jane', 'Smith', '111 East Grove', 'Suite 101', 'Denver', 'CO', '75365',
'8882223333', NULL, NULL, NULL, NULL, 'janeR@gmail.com');
--Bob - added after the fact...I didn't know there were so many like Bob
INSERT INTO #Source (ID, nameFull, salutation, nameFirst, nameLast, addressLine1, addressLine2, addressCity, addressState, addressZip,
phone1full, phone2full, phone3full, phone4full, phone5full, email1)
VALUES ('3', 'Bob Doe', 'Bob', 'Bob', 'Doe', '1234 West Elm', NULL, 'Chicago', 'IL', '45880',
'111', NULL, '111', NULL, NULL, 'Bobd@gmail.com');
INSERT INTO #Target
(pov_Prospect, pov_nameFull, pov_salutation, pov_nameFirst, pov_nameLast,
pov_addressLine1, pov_addressLine2, pov_addressCity, pov_addressState, pov_addressZip,
pov_phone1full, pov_phone2full, pov_phone3full, pov_phone4full, pov_phone5full, pov_email1)
VALUES ('3', 'Bob Doe', 'Bob', 'Bob', 'Doe', '1234 West Elm', NULL, 'Chicago', 'IL', '45880',
'111', NULL, NULL, NULL, NULL, 'Bobd@gmail.com');
------------------------------------------------------------------------------------------------------------------------------------------------------------------
;with data as (
SELECT
s.id,
ISNULL(s.nameFull, '') nameFull ,
ISNULL(s.salutation, '') salutation ,
ISNULL(s.nameFirst, '') nameFirst ,
ISNULL(s.nameLast, '') nameLast ,
ISNULL(s.addressLine1, '') addressLine1 ,
ISNULL(s.addressLine2, '') addressLine2 ,
ISNULL(s.addressCity, '') addressCity ,
ISNULL(s.addressState, '') addressState ,
ISNULL(s.addressZip, '') addressZip ,
ISNULL(s.phone1full, '') phone1full ,
ISNULL(s.phone2full, '') phone2full ,
ISNULL(s.phone3full, '') phone3full ,
ISNULL(s.phone4full, '') phone4full ,
ISNULL(s.phone5full, '') phone5full ,
ISNULL(s.email1, '') email1 ,
ISNULL(t.pov_nameFull, '') pov_nameFull ,
ISNULL(t.pov_salutation, '') pov_salutation ,
ISNULL(t.pov_nameFirst, '') pov_nameFirst ,
ISNULL(t.pov_nameLast, '') pov_nameLast ,
ISNULL(t.pov_addressLine1, '') pov_addressLine1 ,
ISNULL(t.pov_addressLine2, '') pov_addressLine2 ,
ISNULL(t.pov_addressCity, '') pov_addressCity ,
ISNULL(t.pov_addressState, '') pov_addressState ,
ISNULL(t.pov_addressZip, '') pov_addressZip ,
ISNULL(t.pov_phone1full, '') pov_phone1full ,
ISNULL(t.pov_phone2full, '') pov_phone2full ,
ISNULL(t.pov_phone3full, '') pov_phone3full ,
ISNULL(t.pov_phone4full, '') pov_phone4full ,
ISNULL(t.pov_phone5full, '') pov_phone5full ,
ISNULL(t.pov_email1, '') pov_email1
FROM [#Source] [S]
INNER JOIN [#Target] [T]
ON [S].[ID] = [T].[pov_Prospect]
WHERE
ISNULL( s.nameFull, '') <> ISNULL( t.pov_nameFull, '') OR
ISNULL( s.salutation, '') <> ISNULL( t.pov_salutation, '') OR
ISNULL( s.nameFirst, '') <> ISNULL( t.pov_nameFirst, '') OR
ISNULL( s.nameLast, '') <> ISNULL( t.pov_nameLast, '') OR
ISNULL( s.addressLine1, '') <> ISNULL( t.pov_addressLine1, '') OR
ISNULL( s.addressLine2, '') <> ISNULL( t.pov_addressLine2, '') OR
ISNULL( s.addressCity, '') <> ISNULL( t.pov_addressCity, '') OR
ISNULL( s.addressState, '') <> ISNULL( t.pov_addressState, '') OR
ISNULL( s.addressZip, '') <> ISNULL( t.pov_addressZip, '') OR
ISNULL( s.phone1full, '') <> ISNULL( t.pov_phone1full, '') OR
ISNULL( s.phone2full, '') <> ISNULL( t.pov_phone2full, '') OR
ISNULL( s.phone3full, '') <> ISNULL( t.pov_phone3full, '') OR
ISNULL( s.phone4full, '') <> ISNULL( t.pov_phone4full, '') OR
ISNULL( s.phone5full, '') <> ISNULL( t.pov_phone5full, '') OR
ISNULL( s.email1, '') <> ISNULL( t.pov_email1, '')
OR (s.phone1full <> t.pov_phone1full AND s.phone1full <> t.pov_phone2full AND s.phone1full <> t.pov_phone3full AND s.phone1full <> t.pov_phone4full AND s.phone1full <> t.pov_phone5full )
OR (s.phone2full <> t.pov_phone1full AND s.phone2full <> t.pov_phone2full AND s.phone2full <> t.pov_phone3full AND s.phone2full <> t.pov_phone4full AND s.phone2full <> t.pov_phone5full )
OR (s.phone3full <> t.pov_phone1full AND s.phone3full <> t.pov_phone2full AND s.phone3full <> t.pov_phone3full AND s.phone3full <> t.pov_phone4full AND s.phone3full <> t.pov_phone5full )
OR (s.phone4full <> t.pov_phone1full AND s.phone4full <> t.pov_phone2full AND s.phone4full <> t.pov_phone3full AND s.phone4full <> t.pov_phone4full AND s.phone4full <> t.pov_phone5full )
OR (s.phone5full <> t.pov_phone1full AND s.phone5full <> t.pov_phone2full AND s.phone5full <> t.pov_phone3full AND s.phone5full <> t.pov_phone4full AND s.phone5full <> t.pov_phone5full )
)
, fieldsToRows
AS (SELECT
id,
field,
Value
FROM data p UNPIVOT
(value FOR field IN (nameFull, pov_nameFull,
salutation, pov_salutation,
nameFirst, pov_nameFirst,
nameLast, pov_nameLast,
addressLine1, pov_addressLine1,
addressLine2, pov_addressLine2,
addressCity, pov_addressCity,
addressState, pov_addressState,
addressZip, pov_addressZip,
phone1full, pov_phone1full,
phone2full, pov_phone2full,
phone3full, pov_phone3full,
phone4full, pov_phone4full,
phone5full, pov_phone5full,
email1, pov_email1))
AS unpvt
)
SELECT
curr.id,
curr.field,
curr.value new_value,
prev.value old_value,
CASE WHEN curr.value <> prev.value THEN 'Yes' END Changed
FROM
fieldsToRows curr
INNER JOIN fieldsToRows prev
ON curr.ID = prev.id
AND curr.field = 'pov_' + prev.field