首页 > 解决方案 > 返回余额低于阈值的所有记录

问题描述

我正在尝试设置一个查询以返回所有未结余额低于某个阈值(例如 5%)的订单行项目。我毫无顾虑地管理了这个查询,但有一个复杂的问题。我只想在没有任何订单项超出此阈值的情况下退回这些订单项。

例如,如果行项目 1 的订购数量为 100,并且已收到 98,则此行项目将被退回,除非有订单数量为 100 和收到 50 的行项目 2(因为这高于 5%临界点)。

这可能比解释更容易演示,所以我设置了一个简化的 SQL Fiddle 来展示我到目前为止所拥有的。我正在使用 CTE 添加余额字段,然后在我的阈值内进行查询。我很感激任何建议

在小提琴示例中,不应返回 OrderNum 987654,因为该订单有第二个订单项,剩余 50%。

SQL小提琴

;WITH cte as (
  SELECT 
   h.OrderNum
  ,d.ItemNumber
  ,d.OrderedQty
  ,d.ReceivedQty
  ,100.0 * (1 - (CAST(d.ReceivedQty as Numeric(10, 2)) / d.OrderedQty)) as RemainingBal
  FROM OrderHeader h
  INNER JOIN OrderDetail d
  ON h.OrderNum = d.OrderNum
)

SELECT * FROM Cte 
WHERE RemainingBal >0 and RemainingBal <= 5.0

标签: sql-serversql-server-2014

解决方案


我得到这个工作...

  ;WITH cte as (
  SELECT 
   h.OrderNum
  ,d.ItemNumber
  ,d.OrderedQty
  ,d.ReceivedQty
  ,100.0 * (1 - (CAST(d.ReceivedQty as Numeric(10, 2)) / d.OrderedQty)) as 
  RemainingBal
  FROM OrderHeader h
  INNER JOIN OrderDetail d
  ON h.OrderNum = d.OrderNum
 )
 SELECT * FROM Cte WHERE OrderNum IN(
 SELECT OrderNum
 FROM Cte
 GROUP BY OrderNum
 HAVING CAST((SUM(OrderedQty)) - (SUM(ReceivedQty)) AS 
 DECIMAL(10,2))/CAST(SUM(OrderedQty) AS DECIMAL(10,2)) <= .05
)

推荐阅读