表格结构我正在使用: 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
感谢您输入的人。对不起,我的问题没有得到很好的解释,只是所有表格的复杂性和那里的许多业务逻辑。正如它对许多不同表格的数据描述一样,以实现这一目标。
答案 0 :(得分:0)
希望以下SELECT
可以为您提供帮助:
SELECT two.WorkOrderItemId, MIN(COALESCE(twcr.Qty/b.ChildPartQty, 0)) as N
FROM t_WorkOrder two
INNER JOIN BOM b on b.ParentpartId = two.ParentPartId
LEFT JOIN t_WorkCenterRouting twcr ON b.ChildPartId = twcr.ChildPartId AND two.WorkOrderItemId = twcr.workOrderItemId
GROUP BY two.WorkOrderItemId
HAVING MIN(COALESCE(twcr.Qty/b.ChildPartQty, 0)) > 0
ORDER BY two.WorkOrderItemId