在视图中使用的SQL Pivot

时间:2018-10-26 18:34:16

标签: sql-server azure sum pivot

我正在尝试创建一个视图,该视图将汇总不同工作类型的总时数,以及用于RefNumber的不同产品的数量。

我已经成功地总结并总结了RefNumber分组的工作时间,但是现在我开始着手研究如何通过Ref Number汇总产品的总使用量。

Sample Data

Download Excel of data

请记住,在某些RefNumber上,会有多个具有相同ProductID的条目。我们可能有几个人使用不同数量的同一产品。

这也是我尝试数据透视表的内容:

Pivot Data

到目前为止,我已经能够完成每种工作类型的工时总和,并使用以下SQL代码将数据集中到由参考号分组的单个订单项中:

SELECT RefNumber,
SUM (CASE WHEN WorkType = 'Blast' THEN THours ELSE NULL END) AS TBlast,
SUM (CASE WHEN WorkType = 'Wheel' THEN THours ELSE NULL End) As TWheel,
SUM (CASE WHEN WorkType = 'Painting' THEN THours ELSE NULL END) AS TPainter,
SUM (CASE WHEN WorkType = 'Mask/Prep' THEN Thours ELSE NULL END) As TMask,
SUM (CASE WHEN WorkType = 'Demask/Touch Up' THEN Thours ELSE NULL END) As TDMask,
SUM (CASE WHEN WorkType = 'Handling: Raw' THEN THours ELSE NULL END) As TRHand,
SUM (CASE WHEN WorkType = 'Handling: Product' THEN Thours ELSE NULL END) As TPHand,
SUM (CASE WHEN WorkType = 'Wheel:Assist' THEN Thours ELSE NULL END) As TAWheel,
SUM (CASE WHEN WorkType = 'Metalizing' THEN Thours ELSE NULL END) As TMetal


FROM (
SELECT [RefNumber], [WorkType], SUM (Hours)/60 As THours
  FROM [dbo].[Vw_Beta_CostLog]
  GROUP BY RefNumber, WorkType

) sub
GROUP BY RefNumber
ORDER BY RefNumber

关于如何修改此代码库以将不同的产品ID透视到自己的列中,并在第二列中汇总使用这些产品的想法吗?

此外,我希望能够将此视图用作视图,因此我试图避免动态变化。

编辑:忘记了,每个参考编号最多使用4种独特的产品。

原始数据

GUID        EmpName         RefNumber       DateInt     Hours   WorkType         ProductID  PQty
P-3468      Gary Hahn       114204      20181008            132 Painting                NULL    NULL
P-3473      Gary Hahn       114204      20181009            204 Painting                NULL    NULL
P-3475      Gary Hahn       114204      20181009            120 Painting                NULL    NULL
F-31915     Jose Flores     114204      20181007            60  Handling: Raw           NULL    NULL
F-31941     Jose Flores     114204      20181008            30  Handling: Raw           NULL    NULL
F-31951     Chris Pollock   114204      20181008            30  Handling: Raw           NULL    NULL
F-32076     Chris Pollock   114204      20181010            120 Handling: Product       NULL    NULL
F-32109     Chris Pollock   114204      20181011            90  Handling: Product       NULL    NULL
F-32301     Daryl Underwood 114204      20181015            15  Handling: Product       NULL    NULL
B-6594      David Martinez  114204      20181007            150 Blast                   NULL    NULL
B-6599      Emiliano Barrios 114204     20181008            66  Blast                   NULL    NULL
B-6617      Jose Molina     114204      20181009            30  Blast                   NULL    NULL
P-3468      Gary Hahn       114204      20181008        NULL    Primer                      11     3
P-3473      Gary Hahn       114204      20181009        NULL    Intermediate            890    2
P-3475      Gary Hahn       114204      20181009        NULL    Finish                  134HG  2

我正在寻找的输出

RefNumber   Blast   Painting    Handling: Raw   Handling: Product   Product1    P1Qty   Product2    P2Qty   Product3    P3Qty   
114204      246     456           120            225                    11          3          890  2         134HG            2    

1 个答案:

答案 0 :(得分:0)

您可以使用MAX()而不是SUM()来“旋转”非数字数据,并继续使用大小写表达式。

SELECT
    RefNumber
    , SUM (CASE WHEN WorkType = 'Blast'             THEN Hours/60 ELSE NULL END) AS TBlast
    , SUM (CASE WHEN WorkType = 'Wheel'             THEN Hours/60 ELSE NULL End) As TWheel
    , SUM (CASE WHEN WorkType = 'Painting'          THEN Hours/60 ELSE NULL END) AS TPainter
    , SUM (CASE WHEN WorkType = 'Mask/Prep'         THEN Hours/60 ELSE NULL END) As TMask
    , SUM (CASE WHEN WorkType = 'Demask/Touch Up'   THEN Hours/60 ELSE NULL END) As TDMask
    , SUM (CASE WHEN WorkType = 'Handling: Raw'     THEN Hours/60 ELSE NULL END) As TRHand
    , SUM (CASE WHEN WorkType = 'Handling: Product' THEN Hours/60 ELSE NULL END) As TPHand
    , SUM (CASE WHEN WorkType = 'Wheel:Assist'      THEN Hours/60 ELSE NULL END) As TAWheel
    , SUM (CASE WHEN WorkType = 'Metalizing'        THEN Hours/60 ELSE NULL END) As TMetal
    , MAX (CASE WHEN rn = 1 THEN WorkType END)  As WorkType1
    , MAX (CASE WHEN rn = 1 THEN ProductID END) As Product1
    , MAX (CASE WHEN rn = 1 THEN PQty END)      As Qty1

    , MAX (CASE WHEN rn = 2 THEN WorkType END)  As WorkType2
    , MAX (CASE WHEN rn = 2 THEN ProductID END) As Product2
    , MAX (CASE WHEN rn = 2 THEN PQty END)      As Qty2

    , MAX (CASE WHEN rn = 3 THEN WorkType END)  As WorkType3
    , MAX (CASE WHEN rn = 3 THEN ProductID END) As Product3
    , MAX (CASE WHEN rn = 3 THEN PQty END)      As Qty3
FROM (
    SELECT
        [RefNumber]
      , [WorkType]
      , [ProductID]
      , Hours
      , PQty
      , ROW_NUMBER() OVER (PARTITION BY RefNumber, case when ProductID IS NULL then 0 else 1 end ORDER BY ProductID) rn
    FROM [Vw_Beta_CostLog]
) sub
GROUP BY
    RefNumber
ORDER BY
    RefNumber

请注意,您不能创建一个视图,该视图根据使用的产品数量来动态增加或减少列数。

请参阅在线演示:https://rextester.com/SBQUP24417