0

すべてのクライアントの最新の注文と以前の注文を比較したレポートを作成し、次の注文としてより高額の注文をした人だけを比較して返すように依頼されました。(これが理にかなっていることを本当に願っています)

注文履歴テーブルは、各顧客がその顧客に連続する注文番号を持つようにレイアウトされています (例: 顧客が 5 つの注文を出した場合、最上位の注文番号は 5 であり、これはこれを容易にするはずです)。注文数が 5 の顧客の場合、注文番号 4 と 5 を比較し、注文番号 5 がより高い金額の場合にのみ、この顧客を返品したいと考えています。

注文金額は別のテーブルに保存されますが、GUID 参照 (ID) によってリンクされています。

SELECT TOP 1 CO.OrderNumber
                        ,COD.Amount
                FROM cust_OrderDetail COD
                    INNER JOIN dbo.cust_Order CO ON Cod.cust_OrderID = CO.ID 
                    INNER JOIN Customer c ON CO.Customer = c.ID
                WHERE COD.Amount > (SELECT COD1.Amount
                                        FROM cust_OrderDetail COD1
                                        INNER JOIN dbo.cust_Order CO1 ON Cod1.cust_OrderID = CO1.ID 
                                            WHERE CO1.Ordernumber = (This is where I fall apart)

これが理にかなっていることを願っています。私は最後にそこでバラバラになります。他のすべての詳細と、ここで必要なすべてのものをリンクする方法を知っています。私の歯を蹴るのは、この1つの比較だけです.

4

1 に答える 1

0

クエリが Customer および CustomerOrder 情報を正しく返すと仮定します。

アプローチ: CTE で顧客ごとに上位 2 つのレコードを取得し、最上位のレコードを前のレコードと比較します。

WITH Top2 AS (
  SELECT *
  FROM
  (
SELECT c.ID, CO.OrderNumber ,COD.Amount,
  ROW_NUMBER() OVER(PARTITION BY c.ID ORDER BY c.ID, CO.OrderNumber DESC) Rnk
FROM cust_OrderDetail COD
 INNER JOIN dbo.cust_Order CO ON Cod.cust_OrderID = CO.ID 
INNER JOIN Customer c ON CO.Customer = c.ID
    ) T WHERE Rnk <= 2)


SELECT * FROM
(SELECT * FROM Top2 Where Rnk = 1) T1
LEFT JOIN (SELECT * FROM Top2 Where Rnk = 2) T2
ON T1.ID = T2.ID
AND T1.Amount > T2.amount
于 2013-10-11T17:02:14.243 に答える