1

我想获取到目前为止尚未付款的选定客户的所有订单编号,我的数据显示如下:

在此处输入图像描述

我想要的是写一个回答这个问题的 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

怎么做?

谢谢。

4

1 回答 1

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 )

编辑

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

于 2013-03-17T22:58:18.373 回答