一尘不染

SQL Server将列转换为行

sql

我有一个具有当前值和先前值的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中是否可以不循环每一列?


阅读 106

收藏
2021-05-05

共1个答案

一尘不染

您可以使用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

2021-05-05