我想获得所选客户的所有订单ID号码,直到现在还没有支付,我的数据显示如下:
我想要的是写一个回答这个问题的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
怎么做?
感谢。
答案 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 )
修改强>
我刚刚注意到您没有在每个订单行上存储销售价格。我相应地更新了我的答案,但这是一个非常糟糕的主意。如果商品价格发生变化,您的旧订单会发生什么变化?通过在每个订单行上存储销售时的价格来对数据进行非规范化是可以的(实际上是最佳做法)。