我想将数据透视表转换为平面表,但采用以下方式:考虑该表的简单示例:
如您所见,对于每个项目 - 地址或收入 - 我们都有一个旧值列和一个新值(更新值)列。我想将表格转换为“平面”表格,如下所示:
有没有一种简单的方法可以做到这一点?
谢谢您的帮助!
我想将数据透视表转换为平面表,但采用以下方式:考虑该表的简单示例:
如您所见,对于每个项目 - 地址或收入 - 我们都有一个旧值列和一个新值(更新值)列。我想将表格转换为“平面”表格,如下所示:
有没有一种简单的方法可以做到这一点?
谢谢您的帮助!
为了获得结果,您需要 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。如您所见,这cast
在income
列上使用了 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)
看演示
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