可能有更好的方法可以实现,但这就是我所拥有的:
环境 - Plex ERP -SQL查询编辑器
后端 - SQL Server 2012
摘要
详细范围
我正在尝试创建一份销售报告,以防止销售组过载(超出容量)工厂。为了简化,我们假设我们有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。
对不起,很长的帖子。如果有更好的方法可以实现这一点,我愿意接受任何建议。
先谢谢,
麦克