sql - 占集团总数的百分比

标签 sql group-by percentage sql-server-2016

我正在尝试添加一个新列来计算该周每种包装类型的总百分比。

下面的代码会产生以下结果。

image

所以我希望新列显示该特定周百升总数的百分比。

代码:

SET DATEFIRST 1

SELECT 

DATEPART (wk, t0.U_ORC_BE_ProdDate) AS [Week Produced],
--Display week number of date produced
(
CASE 
    WHEN t5.U_ORC_BE_NAME LIKE '%Cans%' 
        THEN 'Cans'
    WHEN t5.U_ORC_BE_NAME LIKE '%Bottles%'
        THEN 'Bottles'
    WHEN t5.U_ORC_BE_NAME LIKE '%Key Keg%'
        THEN 'Key Keg'
    WHEN t5.U_ORC_BE_NAME LIKE '%SS Keg%'
        THEN 'SS Keg'
    WHEN t5.U_ORC_BE_NAME LIKE '%E-Keg%'
        Then 'SS Keg'
END
)AS [Pack Type],
--Collate item types to pack types
sum(t5.U_ORC_BE_HECTOLITER * t0.CmpltQty) AS [Total Hectoliters]
--Calculate total HL in the order


FROM OWOR T0  
INNER JOIN OITT T1 ON T0.ItemCode = T1.Code 
INNER JOIN OITM T2 ON T1.Code = T2.ItemCode
LEFT JOIN [@ORC_BE_PACK_TYPE] t5 ON t5.Code = t2.U_ORC_BE_PACK_TYPE
LEFT JOIN [@ORC_BE_STYLE_H] t6 ON t6.Code= t2.U_ORC_BE_ShortCode

WHERE   
   (t5.U_ORC_BE_HECTOLITER * t0.CmpltQty) != 0 
AND U_ORC_BE_ProcessType = 'Packaging'
AND 
    (
     T0.[U_ORC_BE_ProdDate] >=  dateadd(wk, datediff(wk, 0, getdate()) - 13, 0)
     AND T0.[U_ORC_BE_ProdDate] < dateadd(wk, datediff(wk, 0, getdate()), 0)
    ) 
--For previous 12 weeks

GROUP BY datepart(wk, t0.U_ORC_BE_ProdDate), 

     t0.U_Operator,
    (
    CASE 
        WHEN t5.U_ORC_BE_NAME LIKE '%Cans%' 
            THEN 'Cans'
        WHEN t5.U_ORC_BE_NAME LIKE '%Bottles%'
            THEN 'Bottles'
        WHEN t5.U_ORC_BE_NAME LIKE '%Key Keg%'
            THEN 'Key Keg'
        WHEN t5.U_ORC_BE_NAME LIKE '%SS Keg%'
            THEN 'SS Keg'
        WHEN t5.U_ORC_BE_NAME LIKE '%E-Keg%'
            Then 'SS Keg'
    END
    )

ORDER BY datepart (wk, t0.U_ORC_BE_ProdDate) ASC

最佳答案

使用 SUM() OVER() 来汇总每个日历单位的全部金额,并以此计算百分比。

 SELECT
      d.*
    , ([Total Hectoliters] * 100.0) / SUM([Total Hectoliters]) OVER (PARTITION BY [Week Produced]) [Weekly Pct]
FROM (
      SELECT
            DATEPART(wk, t0.U_ORC_BE_ProdDate)        AS [Week Produced]
            --Display week number of date produced
          , (
            CASE
                  WHEN t5.U_ORC_BE_NAME LIKE '%Cans%' THEN 'Cans'
                  WHEN t5.U_ORC_BE_NAME LIKE '%Bottles%' THEN 'Bottles'
                  WHEN t5.U_ORC_BE_NAME LIKE '%Key Keg%' THEN 'Key Keg'
                  WHEN t5.U_ORC_BE_NAME LIKE '%SS Keg%' THEN 'SS Keg'
                  WHEN t5.U_ORC_BE_NAME LIKE '%E-Keg%' THEN 'SS Keg'
            END
            )                                         AS [Pack Type]
            --Collate item types to pack types
          , SUM(t5.U_ORC_BE_HECTOLITER * t0.CmpltQty) AS [Total Hectoliters]
      --Calculate total HL in the order
      FROM OWOR T0
            INNER JOIN OITT T1 ON T0.ItemCode = T1.Code
            INNER JOIN OITM T2 ON T1.Code = T2.ItemCode
            INNER JOIN [@ORC_BE_PACK_TYPE] t5 ON t5.Code = t2.U_ORC_BE_PACK_TYPE
            LEFT JOIN [@ORC_BE_STYLE_H] t6 ON t6.Code = t2.U_ORC_BE_ShortCode
      WHERE (t5.U_ORC_BE_HECTOLITER * t0.CmpltQty) <> 0
            AND U_ORC_BE_ProcessType = 'Packaging'
            --For previous 12 weeks
            AND (T0.[U_ORC_BE_ProdDate] >= DATEADD(wk, DATEDIFF(wk, 0, GETDATE()) - 13, 0)
            AND T0.[U_ORC_BE_ProdDate] < DATEADD(wk, DATEDIFF(wk, 0, GETDATE()), 0)
            )
      GROUP BY
            DATEPART(wk, t0.U_ORC_BE_ProdDate)
          , t0.U_Operator
          , (
            CASE
                  WHEN t5.U_ORC_BE_NAME LIKE '%Cans%' THEN 'Cans'
                  WHEN t5.U_ORC_BE_NAME LIKE '%Bottles%' THEN 'Bottles'
                  WHEN t5.U_ORC_BE_NAME LIKE '%Key Keg%' THEN 'Key Keg'
                  WHEN t5.U_ORC_BE_NAME LIKE '%SS Keg%' THEN 'SS Keg'
                  WHEN t5.U_ORC_BE_NAME LIKE '%E-Keg%' THEN 'SS Keg'
            END
            )
) AS d
ORDER BY
      [Week Produced] ASC

顺便说一下,因为您的 where 子句坚持别名 t5 满足某些条件,所以在 t5 上使用左连接没有意义。也就是说,因为每一行都必须满足这些条件,所以来自 t5 的 NULL 结果将被忽略,因此外连接与该表无关。

关于sql - 占集团总数的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38222680/

相关文章:

sql - PostgreSQl:选择多行并使其成为一行

sql - 如何在 sql server 2008 中的 exec 语句中使用替换

Sql嵌套组

html - CSS 宽度超出文档宽度的百分比?

r - ggplot 圆环图百分比标签

java - 没有显示答案。有任何想法吗?

mysql - mysql中的自增列

mysql - LEFT JOIN 与表两次以获得单独的记录

python - 使用 groupby 转换从特定行中减去值

sql - 您会将这个简单的 SQL 发回进行返工吗?