查找列对中的值差异

时间:2014-07-03 14:31:03

标签: tsql sql-server-2008-r2

我使用的是SQL Server 2008R2,我有一个返回以下内容的视图:

+----+-------+-------+-------+-------+-------+-------+
| ID | col1A | col1B | col2A | col2B | col3A | col3B |
+----+-------+-------+-------+-------+-------+-------+
|  1 |     1 |     1 |     3 |     5 |     4 |     4 |
|  2 |     1 |     1 |     5 |     5 |     5 |     4 |
|  3 |     3 |     4 |     5 |     5 |     4 |     4 |
|  4 |     1 |     2 |     5 |     5 |     4 |     3 |
|  5 |     1 |     1 |     2 |     2 |     3 |     3 |
+----+-------+-------+-------+-------+-------+-------+

如您所见,此视图包含列对(col1A和col1B),(col2A和col2B),(col3A和col3B)。

我需要查询此视图并查找列对包含不同值的行。 所以我希望回来:

+----+------------+---+-----+
| ID | ColumnType | A |  B  |
+----+------------+---+-----+
|  1 | Col2       | 3 | 5   |
|  2 | Col3       | 5 | 4   |
|  3 | Col1       | 3 | 4   |
|  4 | Col1       | 1 | 2   |
|  4 | Col3       | 4 | 3   |
+----+------------+---+-----+

我想我需要使用UNPIVOT但不确定如何 - 感谢任何建议?

1 个答案:

答案 0 :(得分:1)

由于您使用的是SQL Server 2008+,因此您可以使用CROSS APPLY取消对列的删除,然后您可以轻松地比较AB中的值以返回行不匹配:

select t.ID,
    c.ColumnType,
    c.A,
    c.B
from [dbo].[yourview] t
cross apply
(
    values 
        ('Col1', Col1A, Col1B),
        ('Col2', Col2A, Col2B),
        ('Col3', Col3A, Col3B)
) c (ColumnType, A, B)
where c.A <> c.B;

如果列中有不同的数据类型,则需要将数据转换为相同的类型。您可以在VALUES子句中执行此转换:

select t.ID,
    c.ColumnType,
    c.A,
    c.B
from [dbo].[yourview] t
cross apply
(
    values 
        ('Col1', cast(Col1A as varchar(50)), Col1B),
        ('Col2', cast(Col2A as varchar(50)), Col2B),
        ('Col3', cast(Col3A as varchar(50)), Col3B)
) c (ColumnType, A, B)
where c.A <> c.B