sql-server - 在 View 中使用 SQL Pivot

标签 sql-server azure sum pivot

我正在尝试创建一个 View ,该 View 将不同工作类型的总小时数以及用于引用编号的不同产品的数量相加。

我已经成功地转换并汇总了按引用编号分组的工作时间,但现在我正在绞尽脑汁地思考如何按引用编号汇总产品总使用量。

Sample Data

Download Excel of data

请记住,在某些引用号上,同一 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 转入自己的列,并将这些产品的使用情况汇总到第二列中,有什么想法吗?

此外,我希望能够将其用作 View ,因此我试图避免动态枢轴。

编辑:忘了提及,每个引用号最多可以使用 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    

最佳答案

您可以使用 MAX() 而不是 SUM() 来“透视”非数字数据,并像您已经在做的那样继续使用 case 表达式。

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

请注意,您无法创建根据使用的产品数量动态增加或减少列数的 View 。

查看在线演示:https://rextester.com/SBQUP24417

关于sql-server - 在 View 中使用 SQL Pivot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53014498/

相关文章:

sql-server - TSQL - 使用全文 CONTAINS 的连接

azure sql数据库bcp卡住并回滚

c# - 将 Big ZipArchive-MemoryStream 上传到 Azure

azure - 如何在 Azure 数据工厂 (ADF) 自定义事件中注入(inject)依赖项?

sql - 将列表汇总为逗号分隔的字符串

sql - 两个值如何相等但又不相等?

c# - LINQ 为简单订单生成子查询

mysql - 如何对多个表中存在的相同列求和并将结果显示为一个

对 GLPK 中的二进制变量求和

postgresql - 结合 SUM 和 CAST - 不起作用?