如何通过比较两个表与sql中的列名来计算更改的列数

时间:2017-11-20 05:52:48

标签: sql

如何通过在sql中加入键'id'来比较具有相同列名的两个表来计算更改的列数。

Table 1
id val1  val2  val3  val4
1   a    b    c    d
2   d    f    k    e
4   r    t    y    u

Table 2
id val1 val2 val3 val4
1   a    h    c    l
2   d    f    k    e
4   g    a    w    u

count:
id  count
1    2
2    0
4    3

我希望这个count变量最后添加到第二个表中,并给出从前一个表到此更改的值的计数。

2 个答案:

答案 0 :(得分:3)

你可以使用它。

DECLARE @Table1 TABLE (id INT, val1 VARCHAR(5),  val2 VARCHAR(5), val3 VARCHAR(5), val4 VARCHAR(5))
INSERT INTO @Table1 VALUES
(1,'a', 'b','c','d'),
(2,'d', 'f','k','e'),
(4,'r', 't','y','u')

DECLARE @Table2 TABLE (id INT, val1 VARCHAR(5),  val2 VARCHAR(5), val3 VARCHAR(5), val4 VARCHAR(5))
INSERT INTO @Table2 VALUES
(1, 'a','h','c','l'),
(2, 'd','f','k','e'),
(4, 'g','a','w','u')

SELECT T1.id,  
 (CASE WHEN T1.val1 <> T2.val1 THEN 1 ELSE 0 END)
 + (CASE WHEN T1.val2 <> T2.val2 THEN 1 ELSE 0  END)
 + (CASE WHEN T1.val3 <> T2.val3 THEN 1 ELSE 0 END)
 + (CASE WHEN T1.val4 <> T2.val4 THEN 1 ELSE 0 END) AS [count]
FROM @Table1 T1 INNER JOIN @Table2 T2
ON T1.id = T2.id

或者您可以使用UNPIVOT

SELECT T1.id, SUM (CASE WHEN T1.Val = T2.Val THEN 0 ELSE 1 END) [count] FROM
(SELECT * FROM @Table1 UNPIVOT ( Val FOR Col IN ([val1],[val2],[val3],[val4]) ) UNPVT) T1
    INNER JOIN
(SELECT * FROM @Table2 UNPIVOT ( Val FOR Col IN ([val1],[val2],[val3],[val4]) ) UNPVT) T2
ON T1.id = T2.id AND T1.Col = T2.Col
GROUP BY T1.id

结果:

id  count
1    2
2    0
4    3

答案 1 :(得分:2)

试试这个

SELECT t1.ID,SUM(CASE WHEN t1.VAL1 <> t2.Val1 THEN 1 ELSE 0 END + 
                 CASE WHEN t1.VAL2 <> t2.Val2 THEN 1 ELSE 0 END + 
                 CASE WHEN t1.VAL3 <> t2.Val3 THEN 1 ELSE 0 END +
                 CASE WHEN t1.VAL4 <> t2.Val4 THEN 1 ELSE 0 END )
FROM Table1 t1
INNER JOIN table2 t2 ON t1.ID=t2.ID
GROUP BY t1.ID