我有一个具有当前值和先前值的sql表。
Id Value1 PValue1 Value2 PValue2 1 A A V V1 2 B B1 W W1 3 C C1 X X
我想比较它们,如果值有变化,请在下表中显示。
Id Column Value Pvalue 1 Value2 V V1 2 Value1 B B1 2 Value2 W W1 3 Value1 C C1
在SQL 2008中是否可以不循环每一列?
您可以使用CROSS APPLY取消透视数据:
CROSS APPLY
SELECT t.id, x.Col, x.Value, x.PValue FROM YourTable t CROSS APPLY ( VALUES ('Value1', t.Value1, t.PValue1), ('Value2', t.Value2, t.PValue2) ) x (Col, Value, PValue) where x.Value <> x.PValue;
请参阅带有演示的SQL Fiddle。
仅仅因为我喜欢使用 数据透视 功能,所以以下是同时使用 取消 数据透视 和 数据透视 功能来获取结果的版本:
select id, colname, value, pvalue from ( select id, replace(col, 'P', '') colName, substring(col, 1, PatIndex('%[0-9]%', col) -1) new_col, val from yourtable unpivot ( val for col in (Value1, PValue1, Value2, PValue2) ) unpiv ) src pivot ( max(val) for new_col in (Value, PValue) ) piv where value <> pvalue order by id
参见带有演示的SQL Fiddle