【问题标题】:Trouble with Pivot table数据透视表的问题
【发布时间】:2021-07-27 01:21:34
【问题描述】:

第一次发帖。我对数据透视表非常陌生,并且已经查找了有关如何创建它们的几个答案,但我似乎无法让我的工作。数据透视表是正确的方法吗?

我正在尝试做的是获取所有列并将它们设为行,然后将行变为列。基本上把桌子转90度。见图片。

谢谢

Image of Base query results and results I'm trying to get

基本查询

SELECT        dbo.EstimateDetails.EstimateDetailID,
          dbo.EstimateDetails.QtyOrdered,
          dbo.EstimateDetails.NetPrice, 
          dbo.EstimateDetails.ExtendedPrice, 
          dbo.EstimateDetails.EstimateID, 
          dbo.UserDefined_Custom.UserDefined1, 
          dbo.UserDefined_Custom.UserDefined2,
          dbo.EstimateDetails.OrdUOMID, 
          dbo.Estimate.EstimateNo, 
          dbo.EstimateDetails.[LineNo] AS Line

FROM            dbo.EstimateDetails 
                INNER JOIN dbo.Estimate 
                ON dbo.EstimateDetails.EstimateID = dbo.Estimate.EstimateID 
                LEFT OUTER JOIN dbo.UserDefined_Custom 
                ON dbo.EstimateDetails.ItemSpecID = dbo.UserDefined_Custom.ItemSpecID
                where dbo.EstimateDetails.EstimateID = 141865




                                                                                                                                                                                 

我现在所处的位置没有运气。

Results with Pivot attempt

Select 
Pvt.[1], Pvt.[2], Pvt.[3], Pvt.[4],Pvt.[5],Pvt.[6] 
from

(SELECT        dbo.EstimateDetails.EstimateDetailID,
              dbo.EstimateDetails.QtyOrdered,
              dbo.EstimateDetails.NetPrice, 
              dbo.EstimateDetails.ExtendedPrice, 
              dbo.EstimateDetails.EstimateID, 
              dbo.UserDefined_Custom.UserDefined1, 
              dbo.UserDefined_Custom.UserDefined2,
              dbo.EstimateDetails.OrdUOMID, 
              dbo.Estimate.EstimateNo, 
              dbo.EstimateDetails.[LineNo] AS Line

FROM            dbo.EstimateDetails 
                INNER JOIN dbo.Estimate 
                ON dbo.EstimateDetails.EstimateID = dbo.Estimate.EstimateID 
                LEFT OUTER JOIN dbo.UserDefined_Custom 
                ON dbo.EstimateDetails.ItemSpecID = dbo.UserDefined_Custom.ItemSpecID
                where dbo.EstimateDetails.EstimateID = 141865
) AS Src

PIVOT
(
    Max(EstimateDetailID)
    for Line in ([1], [2], [3], [4],[5],[6])

) AS Pvt

【问题讨论】:

  • 您使用的是哪个 dbms? (也许是 MS SQL Server?)
  • 是的,我使用的是 MS SQL Server。

标签: sql sql-server pivot pivot-table


【解决方案1】:

你需要一个完整的转置,所以首先unpivot然后pivot。请注意,您需要将所有列转换为通用类型。

我个人倾向于使用CROSS APPLY 而不是UNPIVOT,我觉得它更清晰。

您还应该为表使用别名,它使查询更易于编写和阅读。

Select 
    Pvt.Col AS Line, Pvt.[1], Pvt.[2], Pvt.[3], Pvt.[4],Pvt.[5],Pvt.[6] 
from (
    SELECT
        ed.[LineNo] AS Line,
        Upvt.Col,
        Upvt.value
    FROM dbo.EstimateDetails AS ed
    INNER JOIN dbo.Estimate AS e
      ON ed.EstimateID = e.EstimateID 
    LEFT OUTER JOIN dbo.UserDefined_Custom AS udc
      ON ed.ItemSpecID = udc.ItemSpecID
    CROSS APPLY (
        ('EstimateDetailID', CAST(ed.EstimateDetailID AS varchar(50)),
        ('QtyOrdered',       CAST(ed.QtyOrdered AS varchar(50)),
        ('NetPrice',         CAST(ed.NetPrice AS varchar(50)), 
        ('ExtendedPrice',    CAST(ed.ExtendedPrice AS varchar(50)), 
        ('EstimateID',       CAST(ed.EstimateID AS varchar(50)), 
        ('UserDefined1',     CAST(udc.UserDefined1 AS varchar(50)), 
        ('UserDefined2',     CAST(udc.UserDefined2 AS varchar(50)),
        ('OrdUOMID',         CAST(ed.OrdUOMID AS varchar(50)), 
        ('EstimateNo',       CAST(e.EstimateNo AS varchar(50)) 
    ) AS Upvt(Col, Value)
    where ed.EstimateID = 141865
) AS Src

PIVOT
(
    Max(Value)
    for Line in ([1], [2], [3], [4], [5], [6])
) AS Pvt

老实说,现在看,我意识到您确实只是为了显示而将其转置,因此列名实际上没有意义(例如,Line 中有列名)。我建议您在客户端应用程序中执行此操作,T-SQL 确实不适合此操作。

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 2011-10-16
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多