T-SQL聚合行

时间:2014-07-09 13:35:52

标签: sql sql-server-2008 tsql

表格结构我正在使用: 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

感谢您输入的人。对不起,我的问题没有得到很好的解释,只是所有表格的复杂性和那里的许多业务逻辑。正如它对许多不同表格的数据描述一样,以实现这一目标。

  • WorkOrder
  • WorkOrderItem
  • t_WorkCenterRouting
  • t_WorkCenterProductRoute
  • 产品
  • ProductFF
  • 物料清单

1 个答案:

答案 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
相关问题