【发布时间】:2014-08-30 13:38:22
【问题描述】:
我正在使用的表结构: BoM表(制作成品需要什么产品): 这是@BomList 表
╔══════════════╦═════════════╦══════════════╗
║ ParentPartId ║ ChildPartId ║ ChildPartQty ║
╠══════════════╬═════════════╬══════════════╣
║ MCD1 ║ 2000416027 ║ 2 ║
║ MCD1 ║ 2000316029 ║ 1 ║
║ MCD1 ║ 2001020022 ║ 1 ║
╚══════════════╩═════════════╩══════════════╝
工单表(需要创建什么):
╔═════════════╦═════════════════╦══════════════╗
║ WorkOrderId ║ WorkOrderItemId ║ ParentPartId ║
╠═════════════╬═════════════════╬══════════════╣
║ 1234 ║ 6735 ║ MCD1 ║
╚═════════════╩═════════════════╩══════════════╝
一个订单实际生产了多少。 这是 t_WorkCenterRouting 表的缩减版。
╔═════════════════╦═════════════╦═════╗
║ WorkOrderItemId ║ ChildPartId ║ Qty ║
╠═════════════════╬═════════════╬═════╣
║ 6735 ║ 2000316029 ║ 1 ║
║ 6735 ║ 2001020022 ║ 1 ║
║ 6736 ║ 2000416027 ║ 10 ║
║ 6736 ║ 2000316029 ║ 3 ║
║ 6736 ║ 2001020022 ║ 3 ║
║ 6737 ║ 2000416027 ║ 1 ║
║ 6737 ║ 2000316029 ║ 1 ║
║ 6737 ║ 2001020022 ║ 1 ║
╚═════════════════╩═════════════╩═════╝
我正在寻找的输出 因此从上表中我们可以看到 WorkOrderItem 6735 无法制作完整的产品,因为它缺少 2000416027 x2。所以,我不希望显示这些。
我们还可以看到 WorkOrderItem 6737 无法制作完整的产品,因为它缺少 2000416027 x1。所以,我不希望显示这些。
我们也可以看到WorkOrderItem 6736一共可以做x3个产品。
我想查看每个工作订单项的可制造产品的总量。 因此,查询将显示:
╔═════════════════╦═════╗
║ WorkOrderItemId ║ Qty ║
╠═════════════════╬═════╣
║ 6737 ║ 3 ║
╚═════════════════╩═════╝
到目前为止我尝试过的查询:
SELECT twcr.WorkOrderItemId,
bl.ChildPartQty,
SUM( ISNULL( twcr.Qty, 0 ) ) / bl.ChildPartQty AS 'TotalQty'
FROM @BomList bl
LEFT JOIN niko.t_WorkCenterRouting twcr ON twcr.ChildCode = bl.ChildPartId AND twcr.WorkCenterId = 4
WHERE (twcr.WorkCenterRoutingId IS NULL OR twcr.ParentCode = @ProductCode)
GROUP BY twcr.WorkOrderItemId, twcr.ChildCode, bl.ChildPartQty
问题是如果我们查看工作订单项 id 6735 中没有产品 2000416027。所以,我无法匹配工单项得到最小值的数量。
如果这个问题不清楚或缺少任何信息,请告诉我。谢谢。
........
我的丑陋解决方案
SELECT wcr.WorkOrderItemId,
( SELECT TOP 1 ROUND( SUM( ISNULL( twcr.Qty, 0 ) / bl.ChildPartQty ), 0, 1 )
FROM #BomList bl
LEFT JOIN niko.t_WorkCenterRouting twcr ON twcr.ChildCode = bl.ChildPartId AND twcr.WorkCenterId = 4 AND twcr.ParentCode = @WorkOrderCode AND wcr.WorkOrderItemId = twcr.WorkOrderItemId
GROUP BY twcr.WorkOrderItemId, bl.ChildPartId, bl.ChildPartQty
ORDER BY SUM( ISNULL( twcr.Qty, 0 ) / bl.ChildPartQty ) ) AS 'Qty'
FROM niko.t_WorkCenterRouting wcr
WHERE wcr.WorkOrderItemId IN ( SELECT twcr.WorkOrderItemId
FROM #BomList bl
LEFT JOIN niko.t_WorkCenterRouting twcr ON twcr.ChildCode = bl.ChildPartId AND twcr.WorkCenterId = 4 AND twcr.ParentCode = @WorkOrderCode
WHERE (twcr.WorkCenterRoutingId IS NULL OR twcr.ParentCode = @WorkOrderCode )
GROUP BY twcr.WorkOrderItemId, bl.ChildPartId, bl.ChildPartQty ) AND
( SELECT TOP 1 SUM( ISNULL( twcr.Qty, 0 ) / bl.ChildPartQty )
FROM #BomList bl
LEFT JOIN niko.t_WorkCenterRouting twcr ON twcr.ChildCode = bl.ChildPartId AND twcr.WorkCenterId = 4 AND twcr.ParentCode = @WorkOrderCode
GROUP BY twcr.WorkOrderItemId, bl.ChildPartId, bl.ChildPartQty
ORDER BY SUM( ISNULL( twcr.Qty, 0 ) / bl.ChildPartQty ) ) >= 1
GROUP BY wcr.WorkOrderItemId
感谢您的投入。对不起,我的问题没有得到很好的解释,这只是所有表的复杂性和其中的许多业务逻辑。因为它需要对许多不同的表进行数据整形才能达到这个最终目标。
- 工单
- 工作订单项
- t_WorkCenterRouting
- t_WorkCenterProductRoute
- 产品
- 产品FF
- 物料清单
【问题讨论】:
-
1.我们在哪里或如何知道“成品”是什么? (问题的第 1 行和第 2 行)
-
2. “所以从上表中我们可以看到......”只有在我阅读了这些陈述之后,我遗漏了一些东西,我们如何确定某些部分丢失了?
-
我尝试简化问题,因为它包含许多需要大量解释的表格。成品被传递给存储过程,然后使用 CTE 递归来获取制造该成品的所有产品。所以,这是一个简单的变量,我可以用它来获得成品,但这不是那个问题。真正的问题就像您在第二条评论中所说的那样。我们如何确定缺少的部分。如果需要的话,我可以用更多正在使用的表格来扩展我的问题,但我不想让问题变得复杂,以至于没有人会阅读它。
-
该数据的哪一部分告诉我工单项目
6735和2000416027有任何关联 - 我看不到任何代表任何层次结构的地方,也看不到任何这两个 ID 出现在同一行的位置。 -
抱歉,我已经编辑了我的问题。希望能解决一些问题。谢谢你对我的耐心。 :)
标签: sql sql-server-2008 tsql