让SUM(Field_1)不超过SUM(Field_2)

时间:2017-08-02 17:48:33

标签: sql tsql sum report

可能有更好的方法可以实现,但这就是我所拥有的:
环境 - Plex ERP -SQL查询编辑器
后端 - SQL Server 2012

摘要

  • 零件具有基于制造复杂性的“单位”值
  • 有些日子我们发货了。其他日子我们不
  • 对于计划发运的每一天,部件单位的总和为“Rel_Units_Calc”
  • 该工厂每天获得5个单位(开放时)'Unit_multiplier'
  • 每日积分为每天'Unit_Capacity'
  • 为了防止缓慢月份的容量过载,我需要防止工厂在SUM(Unit_Capacity)超过SUM(Rel_Units_Calc)时获得5个单位的功劳。
  • 将创建一个报告,该报告将使用案例陈述来评估Rel_Units_Calc> Unit_Capcity,然后显示红色其他绿色。

详细范围

我正在尝试创建一份销售报告,以防止销售组过载(超出容量)工厂。为了简化,我们假设我们有3个部分(A部分,B部分和C部分)。 A部分很简单,价值1“单位”。 B部分稍微复杂一点,价值2“单位”。 C部分是最复杂的,值得5个“单位”。该工厂每天可以处理5个单元。

当天数没有超载时,报告将通过显示红色和绿色来显示一天超载的时间。红色的任何日子都需要将销售订单移出。

我的方法是取单位*订单数量给我'Release_Units'。然后我在做一个总和(Release_Units)来显示一个名为'Release_Units_Calc'的字段中的每一天的记录。

我还有另一个名为“Unit_Multiplier”的字段,它在符合条件的日期(周日和节假日除外)提供每天5个单位的信用额度。然后我做一个总和(Unit_Multiplier)来显示一个名为'Unit_Capacity'的字段中每天的计数。

将使用比较两列Release_Units_Calc和Unit_Capacity的case语句来确定红色和绿色。当Unit_capacity = Release_Unit时,绿色为红色。

这可以正常工作,直到你看到12月我们对这些零件减速然后我们开始存入Unit_Capacity。即使Unit_Capacity超过Release_Units_Calc,Unit_Capacity字段仍然每天累计5个单位。这些部件不是在12月生产的,所以想想20个工作日*每天5个单位在1月1日给我们100个单位,这是不好的。从本质上讲,这将导致销售团队在1月份压倒工厂,因为他们将拥有100个库存单位。

我想要Unit_Capacity,它是一个SUM(Unit_Multiplier),不超过来自SUM(Release_Units)的Release_Units_Calc。

SQL下面:

此临时表标记了容量

应包含的天数
SELECT
   DISTINCT FDPO.FULL_DATE,
   ----case statement below to create an include flag.  It will exclude weekends unless we have a shipment going out
   (CASE WHEN (DATENAME(dw, DATEADD(d,0,FDPO.Full_Date)) NOT IN
        ('Saturday','Sunday')) THEN 1
         WHEN (DATENAME(dw, DATEADD(d,0,FDPO.Full_Date)) IN
        ('Saturday','Sunday')) AND FDPO.DUE_DATE IS NOT NULL THEN 1
    ELSE 0 END) AS 'Include'
INTO #Capacity_Temp1
FROM #FDPO AS FDPO

此临时表使用include标志删除不应产生容量的日期,并添加容量列。

SELECT 
    CT1.FULL_DATE,
    @Unit_Multiplier AS 'Unit_multiplier'
INTO #Capacity_Temp2
FROM #Capacity_Temp1 AS ct1
WHERE ct1.INCLUDE= 1

下面的临时表格为每天增加单位乘数

SELECT
DISTINCT CT2.FULL_DATE,
CT2.Unit_multiplier,
SUM(CT2.Unit_multiplier) OVER (Order By CT2.FULL_DATE) AS 'Unit_Capacity'

INTO #Unit_Capacity
FROM #Capacity_Temp2 AS CT2

最终显示查询

SELECT
     RUC.FULL_DATE,
     RUC.Release_Units,
     RUC.Release_Units_Calc,--running talley of the release units
     ISNULL(UC.Unit_multiplier,0) AS 'Unit_multiplier',
           -- credit units given per day except when closed 
     UC.Unit_Capacity --running talley of the unit multiplier
FROM #RUC AS RUC
LEFT JOIN #Unit_Capacity AS UC
   ON UC.FULL_DATE = RUC.FULL_DATE

目前的输出:

╔══════╦═══════════════╦════════════════╦═════════════════╦═══════════════╗
║ DATE ║ Release_Units ║ Rel_Units_Calc ║ Unit_multiplier ║ Unit_Capacity ║
╠══════╬═══════════════╬════════════════╬═════════════════╬═══════════════╣
║ 8/3  ║ 15            ║ 15             ║ 5               ║ 5             ║
║ 8/4  ║ NULL          ║ 15             ║ 5               ║ 10            ║
║ 8/5  ║ 20            ║ 50             ║ 5               ║ 15            ║
║ 8/5  ║ 15            ║ 50             ║ 5               ║ 15            ║
║ 8/6  ║ NULL          ║ 50             ║ 0               ║ NULL          ║
║ 8/7  ║ NULL          ║ 50             ║ 5               ║ 20            ║
║ 8/8  ║ NULL          ║ 50             ║ 5               ║ 25            ║
║ 8/9  ║ NULL          ║ 50             ║ 5               ║ 30            ║
║ 8/10 ║ NULL          ║ 50             ║ 5               ║ 35            ║
║ 8/11 ║ NULL          ║ 50             ║ 5               ║ 40            ║
║ 8/12 ║ 15            ║ 65             ║ 5               ║ 45            ║
║ 8/13 ║ NULL          ║ 65             ║ 0               ║ NULL          ║
║ 8/14 ║ NULL          ║ 65             ║ 5               ║ 50            ║
║ 8/15 ║ NULL          ║ 65             ║ 5               ║ 55            ║
║ 8/16 ║ 10            ║ 75             ║ 5               ║ 60            ║
║ 8/17 ║ NULL          ║ 75             ║ 5               ║ 65            ║
║ 8/18 ║ NULL          ║ 75             ║ 5               ║ 70            ║
║ 8/19 ║ NULL          ║ 75             ║ 0               ║ NULL          ║
║ 8/20 ║ NULL          ║ 75             ║ 0               ║ NULL          ║
║ 8/21 ║ NULL          ║ 75             ║ 5               ║ 75            ║
║ 8/22 ║ NULL          ║ 75             ║ 5               ║ 80            ║
║ 8/23 ║ NULL          ║ 75             ║ 5               ║ 85            ║
║ 8/24 ║ NULL          ║ 75             ║ 5               ║ 90            ║
║ 8/25 ║ NULL          ║ 75             ║ 5               ║ 95            ║
║ 8/26 ║ 10            ║ 95             ║ 5               ║ 100           ║
║ 8/27 ║ 10            ║ 95             ║ 5               ║ 105           ║
╚══════╩═══════════════╩════════════════╩═════════════════╩═══════════════╝

问题发生在8月22日,我们开始超过Rel_Units_Calc字段。这允许订单放在8/27上,不会触发红色,因为Unit_Capacity将大于Rel_Units_Calc。

对不起,很长的帖子。如果有更好的方法可以实现这一点,我愿意接受任何建议。

先谢谢,
麦克

0 个答案:

没有答案