I understand my mistake with creating questions in StackOverflow, so I want to rewrite my question.
I have two tables. One of them is my target table with old data and the source table with new data. Implicitly I want to compare these 2 tables and get information on which columns have been changed and changed status.
So I created new temporary tables as below:
x
create table #olddata (
id int,
status1 varchar(50),
status2 varchar(50),
status3 varchar(50),
)
create table #newdata (
id int,
status1 varchar(50),
status2 varchar(50),
status3 varchar(50),
)
--data inside are examples
insert into #olddata
SELECT 1 as id , 'open' as status1 ,'open' as status2, 'closed' as status3 union all
SELECT 2 as id , 'closed' as status1 ,'open' as status2, 'open' as status3 union all
SELECT 3 as id , 'open' as status1 ,'open' as status2, 'closed' as status3
insert into #newdata
SELECT 1 as id , 'open' as status1 ,'closed' as status2, 'open' as status3 union all
SELECT 2 as id , 'closed' as status1 ,'open' as status2, 'open' as status3 union all
SELECT 3 as id , 'open' as status1 ,'open' as status2, 'open' as status3
I want to capture changes, where changes are called “closed” and insert getdate() in these changes. But I can’t, I tried using except statement to get information on which columns have been changed:
--My data below shows changed
with differencescte as (
select * from #newdata
except
select * from #olddata)
--select * from differencescte
,unpivotdiff as (
select ID,Statuss,ChangedStatus
from differencescte
UNPIVOT
(
ChangedStatus for Statuss In (status1,status2,status3)
) as up
)
select * from unpivotdiff
where ChangedStatus <> 'open'
My final step shows ID and status, but how to insert the date of change in except statement to get a table as below? ID|Statuss|ChangedStatus|Dateofchanged|
Advertisement
Answer
here is one approach
drop table if exists #expected
create table #expected (
id int,
changedcolumn varchar(50),
dateofchange datetime);
with target_t as(
SELECT 1 as id , 'open' as status1 ,'open' as status2, 'closed' as status3 union all
SELECT 2 as id , 'closed' as status1 ,'open' as status2, 'open' as status3 union all
SELECT 3 as id , 'open' as status1 ,'open' as status2, 'closed' as status3 )
,source_t as (
SELECT 1 as id , 'open' as status1 ,'closed' as status2, 'open' as status3 union all
SELECT 2 as id , 'closed' as status1 ,'open' as status2, 'open' as status3 union all
SELECT 3 as id , 'open' as status1 ,'open' as status2, 'open' as status3 )
INSERT INTO #expected
SELECT tb.*
FROM(
SELECT
t.id
,'Status1' as changedcolumn
,getdate() AS dateofchange
FROM target_t t
INNER JOIN source_t s
ON t.id = s.id
WHERE ISNULL(t.status1,'') <> ISNULL(s.status1,'')
union all
SELECT
t.id
,'Status2' as changedcolumn
,getdate() AS dateofchange
FROM target_t t
INNER JOIN source_t s
ON t.id = s.id
WHERE ISNULL(t.status2,'') <> ISNULL(s.status2,'')
union all
SELECT
t.id
,'Status3' as changedcolumn
,getdate() AS dateofchange
FROM target_t t
INNER JOIN source_t s
ON t.id = s.id
WHERE ISNULL(t.status3,'') <> ISNULL(s.status3,'')
) tb