簡體   English   中英

T-SQL聚合行

[英]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

謝謝你輸入的人。 對不起,我的問題沒有得到很好的解釋,這只是所有表的復雜性和那里的許多業務邏輯。 因為它是許多不同表的數據整形以達到這個目標。

  • 工作指示
  • WorkOrderItem
  • t_WorkCenterRouting
  • t_WorkCenterProductRoute
  • 產品
  • ProductFF
  • 物料清單

希望以下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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM