2017-10-24 10 views
1

私は顧客による最新かつ高価な購入を探しています。私は顧客、注文、注文の詳細と製品コードを4つのテーブルがあります。すべてのアカウントはemailaddressによって一意です。ほとんどの高価な最近の注文を見つける最も効率的な方法

エラーマルチパート識別子「cx.EmailAddressは」

SELECT c.EmailAddress, 
     o.BillingFirstName AS WC_FirstName, 
     o2.LatestOrder 
FROM Customers c 
JOIN orders o ON o.customerid = c.customerid 
JOIN(SELECT 
      cx.EmailAddress, 
      MAX(o.OrderID) AS LatestOrder 
     FROM Customers AS cx 
     JOIN Orders o ON o.customerid = cx.customerid 
     WHERE o.OrderStatus <> 'CANCELLED' AND o.OrderDate > '09/01/2017 00:00' 
     GROUP BY EmailAddress) AS o2 on o2.EmailAddress = cx.EmailAddress 
GROUP BY c.EmailAddress,o.BillingFirstName 

をバインドすることができませんでしたUPDATEがあまりにも別の方法でそれを試みたが、まだエラーを取得:マルチパート識別子を「c.EmailAddress」ことができませんでした縛られる。

SELECT 
    c.EmailAddress, 
    c.CustomerID, 
    o.OrderDate, 
    p.Google_Gender, 
    p.Google_Age_Group , 
    p.productprice AS Product_Price 
FROM 
    Customers c 
JOIN 
    orders o ON o.CustomerID = c.CustomerID 
JOIN 
    (SELECT 
     c.EmailAddress, 
     MAX(o.OrderID) AS LatestOrder 
    FROM 
     Orders o, Customers c 
    WHERE 
     o.OrderStatus <> 'CANCELLED' AND 
     o.CustomerID = c.CustomerID 
    GROUP BY 
     c.EmailAddress) AS o2 ON o2.EmailAddress = c.EmailAddress 
JOIN 
    (SELECT 
     od.*, 
     c.EmailAddress, 
     row_number() over (partition BY c.EmailAddress 
          ORDER BY od.ProductPrice DESC, o.OrderDate DESC) AS seqnum 
    FROM 
     OrderDetails od 
    JOIN 
     Orders o ON od.OrderID = o.OrderID 
    JOIN 
     Customers c ON o.CustomerID = c.CustomerID 
    JOIN 
     (SELECT 
       c.EmailAddress, 
       MAX(o.OrderID) AS LatestOrder 
      FROM 
       Orders o , Customers c 
      WHERE 
       o.OrderStatus <> 'CANCELLED' AND 
       o.CustomerID = c.CustomerID 
      GROUP BY 
       c.EmailAddress) AS o2 ON o2.EmailAddress = c.EmailAddress 
    WHERE 
     o.OrderID = o2.LatestOrder) od ON od.CustomerID = c.CustomerID 
             AND seqnum = 1 
JOIN 
    Products_Joined p ON od.ProductCode = p.ProductCode 
FULL JOIN 
    (SELECT p.ProductCode, p.ProductName FROM Products_Joined AS p) AS p2 ON p2.ProductCode = p.Google_Age_Group 
WHERE 
    AND o.PaymentAmount <> 0 
    AND o.OrderID = o2.LatestOrder 
GROUP BY 
    c.EmailAddress, o.OrderDate, c.CustomerID, p.productprice, 
    p.Google_Age_Group, p.Google_Gender, p.Google_Pattern, 
    p.Google_Size, od.ProductName, p.ProductName, p2.productname, 
    p.productcode 
ORDER BY 
    o.OrderDate DESC, MAX(od.ProductPrice) DESC; 
+0

クエリのヘルプが必要な場合は、テーブルの構造を含める必要があります。あなたは金額フィールドを指定せず、最も高価なものではなく、最新の注文を取得しています。 – Andrew

+0

エラーメッセージが混乱しないように、テーブルエイリアスを繰り返さないことをお勧めします。サブクエリはたくさんあり、常に顧客のエイリアスとして 'c'を使います。あなたはそこにFULL(OUTER)JOINしてもよろしいですか? – Andrew

答えて

1

cxo2クエリ内の内部の別名であるので、あなたはそのエラーを持っています。だから、おそらくそれはこの1つの結合条件を変更する必要があります。

AS o2 on o2.EmailAddress = c.EmailAddress

この方法は、あなたが直接顧客からの1を使用してo2メールアドレスに参加します。

パフォーマンスを向上させるため、電子メールではなく、最初の参加時と同じように、顧客にCustomerIDで参加する方がよいでしょう。

最後に、OrderIDのMAXを実行しています。これはおそらく最新の注文を返す可能性が高いです。あなたは内側のクエリでCustomersテーブルを必要としない

SELECT c.EmailAddress, 
     o.BillingFirstName AS WC_FirstName, 
     MostExpensiveOrderId = o.OrderId, 
     MostExpensiveOrderAmount = o.Amount 
FROM Customers c 
INNER JOIN (
    SELECT 
     CustomerID, 
     MAX(Amount) 
    FROM Orders 
    WHERE OrderStatus <> 'CANCELLED' AND OrderDate > '09/01/2017 00:00' 
    GROUP BY CustomerID 
) AS omax ON omax.CustomerID = C.CustomerID 
INNER JOIN Orders o ON o.CustomerID = c.CustomerID AND o.Amount = omax.Amount 
ORDER BY c.EmailAddress, o.BillingFirstName 

注:心の中で、あなたはおそらくこのような何かにあなたのクエリを変更する必要があることを持つことは(私はAmountを推測しているフィールドの名前です) 。また、最高値が複数の注文と共有されている場合、顧客ごとに複数の行が表示される可能性があります。

+0

私は試みている他の方法でクエリを更新しましたが、それでもcouldnot boundエラーを取得しています。そして、顧客は電子メールアドレスではなく、顧客ではなく、なぜ私はそれに参加しようとしているのですか?それでもエラーが発生します。 – jsingh

+0

CustomerIDは一意ではありませんか?それはあなたが意味するものではないことを願っています。 IDによる結合は、特にPKの場合は、varcharフィールドよりも常に高速です。また、より明確になります。 – Andrew

関連する問題