SQL Unpivot多列数据

use*_*310 18 sql sql-server unpivot sql-server-2008

我正在使用SQL Server 2008,我正在尝试取消数据.这是我正在使用的SQL代码,

CREATE TABLE #pvt1 (VendorID int, Sa int, Emp1 int,Sa1 int,Emp2 int)
GO
INSERT INTO #pvt1  VALUES (1,2,4,3,9);

GO

--Unpivot the table.
SELECT distinct VendorID,Orders,Orders1
FROM 
   (SELECT VendorID, Emp1, Sa,Emp2,Sa1
   FROM #pvt1 ) p
UNPIVOT
   (Orders FOR Emp IN 
      (Emp1,Emp2)
)AS unpvt
UNPIVOT
   (Orders1 FOR Emp1 IN 
      (Sa,Sa1)
)AS unpvt1;
GO
Run Code Online (Sandbox Code Playgroud)

这是上述代码的结果.

VendorID    Orders  Orders1
1            4      2
1            4      3
1            9      2
1            9      3
Run Code Online (Sandbox Code Playgroud)

但我希望我的输出方式如下所示

VendorID    Orders  Orders1
1           4       2
1           9       3
Run Code Online (Sandbox Code Playgroud)

上述代码的关系是2与4相关,3与9有关.

我怎样才能做到这一点?

Tar*_*ryn 32

一种更简单的方法来取消数据的转换将是使用CROSS APPLY来成对地取消成对列:

select vendorid, orders, orders1
from pvt1
cross apply
(
  select emp1, sa union all
  select emp2, sa1
) c (orders, orders1);
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.或者,如果您不想使用UNION ALL,则可以将CROSS APPLY与VALUES子句一起使用:

select vendorid, orders, orders1
from pvt1
cross apply
(
  values 
    (emp1, sa),
    (emp2, sa1)
) c (orders, orders1);
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

  • 哇...这是超级有用的,但我从来没有打扰过。我需要加快 CROSS APPLY 的速度。 (2认同)