Сравните 2 строки и 2 столбца и найдите различия - PullRequest
0 голосов
/ 04 апреля 2019

Необработанные данные

+--------+-------+---------------+---------------+---------------+---------------+---------------+---------------+
| RowNum | SeqNo |     Col1      |     Col2      |     Col3      |     Col4      |     Col5      |     Col6      |
+--------+-------+---------------+---------------+---------------+---------------+---------------+---------------+
|      1 | A123  | A             | 'emptystring' | 'emptystring' | 'emptystring' | Z             | 'emptystring' |
|      2 | A123  | 'emptystring' | B             | 'emptystring' | 'emptystring' | 'emptystring' | D             |
|      1 | B123  | 'emptystring' | 'emptystring' | C             | 'emptystring' | 'emptystring' | 'emptystring' |
|      2 | B123  | 'emptystring' | 'emptystring' | 'emptystring' | D             | 'emptystring' | 'emptystring' |
|      1 | C123  | A             | 'emptystring' | B             | 'emptystring' | 'emptystring' | 'emptystring' |
|      2 | C123  | 'emptystring' | A             | 'emptystring' | B             | 'emptystring' | A             |
+--------+-------+---------------+---------------+---------------+---------------+---------------+---------------+

Желание Результат:

+-------+---------------+----------+
| SeqNo |  From_Value   | To_Value |
+-------+---------------+----------+
| A123  | A             | B        |
| A123  | Z             | D        |
| B123  | C             | D        |
| C123  | 'emptystring' | A        |
+-------+---------------+----------+

Как получить желаемый результат?Желаемый результат - зафиксировать внесенные изменения (на основании желаемого результата).EmptyString - пустое значение NOT NULL, только пробел.

SeqNo - уникальный номер, который не будет дублироваться (в необработанных данных).

RowNum = 1 = From_Value = Col1, Col3, Col5 (это не будетбыть измененным)

RowNum = 2 = To_Value = Col2, Col4, Col6 (это не будет изменением)

Ответы [ 4 ]

0 голосов
/ 04 апреля 2019
DECLARE @Raw TABLE(
        RowNum int,
        SeqNo nvarchar(20),
        Col1 nvarchar(max),
        Col2 nvarchar(max),
        Col3 nvarchar(max),
        Col4 nvarchar(max),
        Col5 nvarchar(max),
        Col6 nvarchar(max)
    )

insert @Raw values
    (1, 'A123', 'A', '    ', '    ', '    ', 'Z', '    '),
    (2, 'A123', '    ', 'B', '    ', '    ', '    ', 'D'),
    (1, 'B123', '    ', '    ', 'C', '    ', '    ', '    '),
    (2, 'B123', '    ', '    ', '    ', 'D', '    ', '    '),
    (1, 'C123', 'A', '    ', 'B', '    ', '    ', '    '),
    (2, 'C123', '    ', 'A', '    ', 'B', '    ', 'A')


SELECT SeqNo,value_from,value_to FROM
(
SELECT SeqNo, 1 as _lp, RowNum, Col1 as value_from ,LEAD(Col2,1,Col1) OVER(PARTITION BY SeqNo order by RowNum ) as value_to FROM @Raw
UNION ALL
SELECT SeqNo, 2 as _lp, RowNum, Col3 as value_from ,LEAD(Col4,1,Col3) OVER(PARTITION BY SeqNo order by RowNum ) as value_to FROM @Raw
UNION ALL
SELECT SeqNo, 3 as _lp, RowNum, Col5 as value_from ,LEAD(Col6,1,Col5) OVER(PARTITION BY SeqNo order by RowNum ) as value_to FROM @Raw
) as tab
WHERE value_from!=value_to 
order by SeqNo,_lp
0 голосов
/ 04 апреля 2019
create table #Raw (
        RowNum int,
        SeqNo nvarchar(20),
        Col1 nvarchar(max),
        Col2 nvarchar(max),
        Col3 nvarchar(max),
        Col4 nvarchar(max),
        Col5 nvarchar(max),
        Col6 nvarchar(max)
    )
insert #Raw values
    (1, 'A123', 'A', '    ', '    ', '    ', 'Z', '    '),
    (2, 'A123', '    ', 'B', '    ', '    ', '    ', 'D'),
    (1, 'B123', '    ', '    ', 'C', '    ', '    ', '    '),
    (2, 'B123', '    ', '    ', '    ', 'D', '    ', '    '),
    (1, 'C123', 'A', '    ', 'B', '    ', '    ', '    '),
    (2, 'C123', '    ', 'A', '    ', 'B', '    ', 'A')


select  f.SeqNo, f.Col1 [From_Value], t.Col2 [To_Value]
    from #Raw f
    join #Raw t on
        t.SeqNo = f.SeqNo
        and t.RowNum = 2
        and f.Col1 <> t.Col2
    where
        f.RowNum = 1
union
select  f.SeqNo, f.Col3 [From_Value], t.Col4 [To_Value]
    from #Raw f
    join #Raw t on
        t.SeqNo = f.SeqNo
        and t.RowNum = 2
        and f.Col3 <> t.Col4
    where
        f.RowNum = 1
union
select  f.SeqNo, f.Col5 [From_Value], t.Col6 [To_Value]
    from #Raw f
    join #Raw t on
        t.SeqNo = f.SeqNo
        and t.RowNum = 2
        and f.Col5 <> t.Col6
    where
        f.RowNum = 1


drop table #Raw
0 голосов
/ 04 апреля 2019

Вот альтернатива, которая использует только одно соединение.

DECLARE @RowData TABLE(RowNum INT, SeqNo VARCHAR(10), Col1Before VARCHAR(10), Col1After VARCHAR(10), Col2Before VARCHAR(10), Col2After VARCHAR(10), Col3Before VARCHAR(10), Col3After VARCHAR(10))

INSERT INTO @RowData
VALUES
    (1, 'A123', 'A', '', '', '', 'Z', ''),
    (2, 'A123', '', 'B', '', '', '', 'D'),
    (1, 'B123', '', '', 'C', '', '', ''),
    (2, 'B123', '', '', '', 'D', '', ''),
    (1, 'C123', 'A', '', 'B', '', '', ''),
    (2, 'C123', '', 'A', '', 'B', '', 'A')

SELECT
    ColumnChange.SeqNo
    ,ColumnChange.BeforeValue
    ,ColumnChange.AfterValue
FROM
    @RowData AS BeforeRow
    INNER JOIN @RowData AS AfterRow
        ON BeforeRow.SeqNo = AfterRow.SeqNo
            AND BeforeRow.RowNum = 1
            AND AfterRow.RowNum = 2
    CROSS APPLY(
        SELECT
            SeqNo
            ,TableColumn
            ,BeforeValue
            ,AfterValue
        FROM
            (VALUES
                (BeforeRow.SeqNo, 'Col1', BeforeRow.Col1Before, AfterRow.Col1After),
                (BeforeRow.SeqNo, 'Col2', BeforeRow.Col2Before, AfterRow.Col2After),
                (BeforeRow.SeqNo, 'Col3', BeforeRow.Col3Before, AfterRow.Col3After)
            ) AS ColumnChange(SeqNo, TableColumn, BeforeValue, AfterValue)
        WHERE
            ColumnChange.BeforeValue IS NULL AND ColumnChange.AfterValue IS NOT NULL
            OR ColumnChange.BeforeValue IS NOT NULL AND ColumnChange.AfterValue IS NULL
            OR ColumnChange.BeforeValue != ColumnChange.AfterValue
    ) AS ColumnChange
0 голосов
/ 04 апреля 2019

Чтобы найти эти «измененные значения», вы можете использовать следующий запрос:

with
from_to as (
  select t1.seqno, t1.col1 as f, t2.col2 as t
  from t t1
  join t t2 on t1.seqno = t2.seqno and t1.rownum = 1 and t2.rownum = 2
  union  
  select t1.seqno, t1.col3 as f, t2.col4 as t
  from t t1
  join t t2 on t1.seqno = t2.seqno and t1.rownum = 1 and t2.rownum = 2
  union
  select t1.seqno, t1.col5 as f, t2.col6 as t
  from t t1
  join t t2 on t1.seqno = t2.seqno and t1.rownum = 1 and t2.rownum = 2
)
select seqno, f as from_value, t as to_value
from from_to
where f is null and t is not null
   or f is not null and t is null
   or f <> t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...