0

我想将数据透视表转换为平面表,但采用以下方式:考虑该表的简单示例:

在此处输入图像描述

如您所见,对于每个项目 - 地址或收入 - 我们都有一个旧值列和一个新值(更新值)列。我想将表格转换为“平面”表格,如下所示:

在此处输入图像描述

有没有一种简单的方法可以做到这一点?

谢谢您的帮助!

4

2 回答 2

1

为了获得结果,您需要 UNPIVOT 数据。当您取消透视时,您将多列转换为多行,这样做时数据的数据类型必须相同。

我会使用 CROSS APPLY 来成对取消透视列:

select t.employee_id,
  t.employee_name,
  c.data,
  c.old,
  c.new
from yourtable t
cross apply
(
  values 
  ('Address', Address_Old, Address_new),
  ('Income', cast(income_old as varchar(15)), cast(income_new as varchar(15)))
) c (data, old, new);

请参阅带有演示的 SQL Fiddle。如您所见,这castincome列上使用了 a,因为我猜它是与address. 由于最终结果将在同一列中包含这些值,因此数据必须属于同一类型。

这也可以使用带有 UNION ALL 的 CROSS APPLY 来编写:

select t.employee_id,
  t.employee_name,
  c.data,
  c.old,
  c.new
from yourtable t
cross apply
(
  select 'Address', Address_Old, Address_new union all
  select 'Income', cast(income_old as varchar(15)), cast(income_new as varchar(15))
) c (data, old, new)

演示

于 2013-09-25T13:58:23.687 回答
1
select employee_id,employee_name,data,old,new
from (
select employee_id,employee_name,adress_old as old,adress_new as new,'ADRESS' as data
from employe
union
select employee_id,employee_name,income_old,income_new,'INCOME'
from employe
 ) data
order by employee_id,data

看到这个小提琴演示: http ://sqlfiddle.com/#!2/64344/7/0

于 2013-09-25T14:00:59.743 回答