[英]T-SQL Aggregating rows
我正在使用的表結構: 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
謝謝你輸入的人。 對不起,我的問題沒有得到很好的解釋,這只是所有表的復雜性和那里的許多業務邏輯。 因為它是許多不同表的數據整形以達到這個目標。
希望以下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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.