【问题标题】:How to add corresponding columns to a PIVOT dataset如何将相应的列添加到 PIVOT 数据集
【发布时间】:2017-01-24 05:45:11
【问题描述】:

使用 Microsoft SQL Server 2012。

我有一张桌子:

PartID |TypeSet | Setting | ObservID |TransDate
---------------------------------------------
 1         A    456       12    10/20/2015
 1         A    377       12    10/20/2015
 1         A    425       12    10/20/2015
 1         A    665       12    10/20/2015
 1         A    543       12    10/20/2015
 1         A    554       12    10/20/2015
 1         B    34        41    10/21/2015
 1         B    27        41    10/21/2015
 1         B    27        41    10/21/2015
 1         B    29        41    10/21/2015
 1         C    1299      12    10/20/2015
 1         C    1227      12    10/20/2015

我想显示如下。按 PartID 分组的单行。

PartID | A Avg | B Avg | C Avg |  A ObservID | B ObservID | C ObservID
 ---------------------------------------------------------------------
  1      503      29     1263        12             41         12

如果不创建多行返回数据集,我无法显示 ObservID。我对这个查询的 A、B 和 C 平均值没有任何问题:

  SELECT    
      PartID
      ,[A] as 'A Average'
      ,[B] as 'B Average'   
      ,[C] as 'C Average'
     -- ,(ObservID)
     --,CASE WHEN [A] = 'A Average' THEN max([ObservID]) END as 'A Ob'
     --,CASE WHEN [B] = 'B Average' THEN max([ObservID]) END as 'B Ob'
     -- ,CASE WHEN [C] = 'C Average' THEN max([ObservID]) END as 'C Ob'
FROM
(SELECT
    PartID  
    ,TypeSet
    ,Setting
    --,ObservID
    FROM  #Temp1
    ) as MeasData
PIVOT
(
    AVG(Setting) 
    FOR [TypeSet] in 
        ( [A], [B], [C])    
) as PivotTable

您可以在上面的查询中看到我试图在其中获取 ObservID 但是当我取消注释这些行时,会发生错误。 一些注意事项:每个 TypeSet 的 ObservID 将保持一致。

这是数据:

create table #Temp1
(
  PartID INT
, TypeSet VARCHAR(10) 
, Setting INT
, ObservID INT
, TransDate Date
)

INSERT INTO #Temp1(PartID, TypeSet, Setting, ObservID, TransDate) VALUES
  (1, 'A', 456, 12, '10/20/2015'),
  (1, 'A', 377, 12, '10/20/2015'),
  (1, 'A', 425, 12, '10/20/2015'),
  (1, 'A', 665, 12, '10/20/2015'),
  (1, 'A', 543, 12, '10/20/2015'),
  (1, 'A', 554, 12, '10/20/2015'),
  (1, 'B', 34, 41, '10/21/2015'),
  (1, 'B', 27, 41, '10/21/2015'),
  (1, 'B', 27, 41, '10/21/2015'),
  (1, 'B', 29, 41, '10/21/2015'),
  (1, 'C', 1299, 12, '10/20/2015'),
  (1, 'C', 1227, 12, '10/20/2015')

PIVOT 操作能否实现我想要的输出?还是应该为每个 Typeset 在表上走多个 JOIN 的路线?

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    您可以使用条件聚合

    SELECT PartID,
         AVG(CASE WHEN TypeSet = 'A' THEN Setting END) AS 'A Avg',
         AVG(CASE WHEN TypeSet = 'B' THEN Setting END) AS 'B Avg',
         AVG(CASE WHEN TypeSet = 'C' THEN Setting END) AS 'C Avg',
         MAX(CASE WHEN TypeSet = 'A' THEN ObservID END) AS 'A ObservID',
         MAX(CASE WHEN TypeSet = 'B' THEN ObservID END) AS 'B ObservID',
         MAX(CASE WHEN TypeSet = 'C' THEN ObservID END) AS 'C ObservID'
    FROM #Temp1
    GROUP BY PartID
    

    【讨论】:

    • 这很棒。得到我需要的东西。我唯一关心的是性能,但与此同时,我还没有审查解释计划......但是谢谢你。
    • @Charlie 这应该和使用PIVOT 的任何查询一样快。 PIVOT 实际上是条件聚合的语法糖。
    【解决方案2】:
      WITH avgPivot AS
    (
      SELECT 
          PartID,[a] as A_Avg,[b] as B_Avg,[c] as C_Avg
      FROM
      (
        SELECT PartID, TypeSet, Setting, ObservID
        FROM #Temp1
      ) As S
      PIVOT
      (
         AVG(Setting)
         FOR TypeSet in([a],[b],[c])
      )
      AS pvt
    ),
    maxPivot AS
    (
      SELECT 
           [a] as A_ObservID, [B]B_ObservID, [c] as c_ObservID
      FROM
      (
        SELECT PartID, TypeSet, Setting, ObservID
        FROM #Temp1
      ) As S
      PIVOT
      (
         max(ObservID)
         FOR TypeSet in([a],[b],[c])
      )
      AS pvt
    )
    
    SELECT distinct *
    FROM avgPivot M
     cross JOIN maxPivot A
    

    【讨论】:

    • 这给了我 NULL 并创建了一个多行数据集。
    • 抱歉不清楚,但是是的,基于 PartID 的单行
    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2012-10-23
    相关资源
    最近更新 更多