如何获取SQL Server 2008中未支付的所有订单ID?

时间:2013-03-17 22:43:46

标签: sql-server-2008

我想获得所选客户的所有订单ID号码,直到现在还没有支付,我的数据显示如下:

enter image description here

我想要的是写一个回答这个问题的SELECT语句:

select orderID 
from order 
where customer id = @custID 
and Total cashmovementValue 
        for current order id 
    is less than total (sold quantity * salePrice ) 
        for current order id

怎么做?

感谢。

1 个答案:

答案 0 :(得分:0)

您需要将每个订单行的总和与每个订单的每笔付款的总和进行比较。 GROUP BY以及一些子查询是完成工作所需的。

这样的事情应该有效:

SELECT
    O.OrderID
FROM [Order] O
INNER JOIN (
   -- Add up cost per order
   SELECT 
       OrderID,
       SUM(SoldQuantity * P.SalePrice) AS Total
   FROM OrderLine
   INNER JOIN Product P ON P.ProductID = OrderLine.ProductID     
   GROUP BY OrderID
) OL ON OL.OrderID = O.OrderID
LEFT JOIN (
    -- Add up total amount paid per order
    SELECT
        OrderID,
        SUM(CashMovementValue) AS Total
    FROM CashMovement
    GROUP BY OrderID
) C ON C.OrderID = O.OrderID
WHERE
    O.CustomerID = @custID
    AND ( C.OrderID IS NULL OR C.Total < OL.Total )

修改

我刚刚注意到您没有在每个订单行上存储销售价格。我相应地更新了我的答案,但这是一个非常糟糕的主意。如果商品价格发生变化,您的旧订单会发生什么变化?通过在每个订单行上存储销售时的价格来对数据进行非规范化是可以的(实际上是最佳做法)。