PIVOT和UNPIVOT如何运作?

时间:2014-01-30 20:10:29

标签: sql sql-server tsql pivot unpivot

我正在尝试理解SQL Server 2012上T-SQL中的PIVOTUNPIVOT命令。我完全理解这些命令的作用,但我想了解更多细节。< / p>

目前我缺乏理解为什么当我尝试使用unpivot时,我必须为pivot命令放置源表的列的原始名称。首先,我创建了一个新表,并使用pivot命令从另一个表中放入一些数据。

USE testdb;
IF OBJECT_ID('dbo.EmpCustOrders', 'U') IS NOT NULL
    DROP TABLE dbo.EmpCustOrders;

SELECT empid, A, B,C, D
INTO dbo.EmpCustOrders
FROM (SELECT empid, custid, qty
    FROM dbo.Orders) AS D
PIVOT (SUM(qty) FOR custid IN (A, B, C, D)) As newtable;

一切都好。然后我尝试使用UNPIVOT命令来创建一些表视图:

USE testdb;
SELECT empid, custid, qty
FROM dbo.EmpCustOrders
UNPIVOT (qty FOR custid IN (A, B, C, D)) AS newTable;

结果 - 这一切都很完美,我可以理解为什么,当我写SELECT时,我必须将列的名称设为custidqty,这些列与它们完全相同在上一个表中,但不是在我在单独的派生表上写UNPIVOT时。这些信息如何以及在何处存储在刚刚创建的表中?我错过了哪一部分......

为了更好地说明问题 - 添加一些描述情况的图片。

enter image description here


修改

enter image description here

1 个答案:

答案 0 :(得分:1)

您不需要使用相同的列名,但您正在执行的操作是反转上一个命令,在这种情况下,原始字段名称是有意义的。

USE testdb;
SELECT empid, apples, oranges
FROM dbo.EmpCustOrders
UNPIVOT (oranges FOR apples IN (A, B, C, D)) AS newTable;

同样可以正常工作,但不那么有意义。