1

今まで支払っていない選択した顧客のすべての注文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

どうやってするの?

ありがとう。

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 に答える