【问题标题】:How does PIVOT and UNPIVOT work?PIVOT 和 UNPIVOT 是如何工作的?
【发布时间】:2014-01-30 20:10:28
【问题描述】:

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

目前我不明白为什么当我尝试使用 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 时,我必须将列名称设置为 custidqty,它们与上表中的完全相同,但是不是当我在单独的派生表上写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


【解决方案1】:

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

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

同样有效,但意义不大。

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 2019-09-25
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多