【发布时间】:2014-01-30 20:10:28
【问题描述】:
我正在尝试了解 SQL Server 2012 上 T-SQL 中的 PIVOT 和 UNPIVOT 命令。我完全了解这些命令的作用,但我想了解更多细节。
目前我不明白为什么当我尝试使用 unpivot 时,我必须将源表的列的原始名称用于 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 时,我必须将列名称设置为 custid 和 qty,它们与上表中的完全相同,但是不是当我在单独的派生表上写UNPIVOT 时。这些信息如何以及在哪里存储在刚刚创建的表中?我错过了其中的哪一部分...
为了更好地说明问题 - 添加一些描述情况的图片。
编辑
【问题讨论】:
-
那张截图太棒了。颜色也不错。
-
所以,您不明白为什么需要将列名放入
UNPIVOT?。 SQL Server 怎么知道它应该使用的名称?,没有办法知道您要取消透视的表是以前从另一个PIVOT创建的,所以它不能只是猜测它应该从中获取列名Orders表 -
@Lamak,但是如果我使用
PIVOT填充数据库中的单独表(意味着我用另一个表的信息填充空表),那么我想使用UNPIVOT来刚刚创建的表(已经从 PIVOT 请求中添加了信息,但具有不同的列名 - 你可以在图片上看到这个)我必须使用表中的列名,这就像PIVOT命令的来源?我说的对吗? -
@Kirill 它进入
UNPIVOT函数部分,然后它将在外部选择中可用。你可以使用SELECT empid, custid2, qty2 FROM dbo.EmpCustOrders UNPIVOT (qty2 FOR custid2 IN (A, B, C, D)) AS newTable -
@Kirill 您的编辑显示错误代码,应该是
UNPIVOT (qty2 FOR custid2 IN ....
标签: sql sql-server tsql pivot unpivot