【问题标题】:T-SQL Aggregating rowsT-SQL 聚合行
【发布时间】: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 递归来获取制造该成品的所有产品。所以,这是一个简单的变量,我可以用它来获得成品,但这不是那个问题。真正的问题就像您在第二条评论中所说的那样。我们如何确定缺少的部分。如果需要的话,我可以用更多正在使用的表格来扩展我的问题,但我不想让问题变得复杂,以至于没有人会阅读它。
  • 该数据的哪一部分告诉我工单项目 67352000416027 有任何关联 - 我看不到任何代表任何层次结构的地方,也看不到任何这两个 ID 出现在同一行的位置。
  • 抱歉,我已经编辑了我的问题。希望能解决一些问题。谢谢你对我的耐心。 :)

标签: sql sql-server-2008 tsql


【解决方案1】:

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

【讨论】:

  • 感谢您的意见我应该说 t_WorkCenterRouting 没有总结。在我有空闲时间尝试更好的可读性和可管理性之前,我将坚持使用我丑陋的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多