2009-04-07 14 views
36

は、私がのSQLServerに以下の3つのテーブルを持っている想像して参加:最近の記録は

Customer (CustomerID, FirstName, LastName) 
Address (AddressID, CustomerID, Line1, City, State) 
Product (ProductID, CustomerID, Description) 

顧客が複数の配信アドレスとmulitple製品を持つことができます。

私がしたいのは、最新のアドレスレコードによって州が決定された各州の顧客数をリストすることです。 「どの州の顧客が最後に商品を受け取ったか?したがって、私は顧客の以前の住所記録には関心がなく、最も最近のもの(AddressIDによって決定されたもの)のみに興味があります。お客様は、お客様のみが最新のアドレスレコードの状態でカウントされます複数のアドレスを有することができるよう、しかし

SELECT a.State, count(c.CustomerID) 
FROM Product p 
INNER JOIN Customer c ON c.CustomerID = p.CustomerID 
LEFT JOIN Address a ON a.CustomerID = c.CustomerID 
WHERE p.ProductID = 101 
GROUP BY a.State 

State | Number of Customers 
-------------------------- 
CA | 32 
GA | 12 
TX | 0 
OH | 18 

私は普通のような何かをしますか?

P.S.上記は、私が達成しようとしている結合を簡単に説明するための例示的なシナリオであり、実際のシステム設計を反映していません。

SELECT state, count(customer_id) 
FROM (
    SELECT 
     p.customer_id 
     , (SELECT TOP 1 State FROM Address WHERE Address.CustomerID = p.CustomerID ORDER BY Address.ID DESC) state 
    FROM Product p 
    WHERE p.ProductID = 101) 
GROUP BY state 

答えて

65

これを試してみてください:

SELECT a.State, count(c.CustomerID) 
FROM Product p 
INNER JOIN Customer c ON c.CustomerID = p.CustomerID 
LEFT JOIN Address a ON a.CustomerID = c.CustomerID 
     AND a.AddressID = 
     (
      SELECT MAX(AddressID) 
      FROM Address z 
      WHERE z.CustomerID = a.CustomerID 
     ) 
WHERE p.ProductID = 101 
GROUP BY a.State 
+0

私が探していたもの、多くのおかげです。 –

+0

素晴らしい!今、なぜ私はこれを考えなかったのですか? –

+5

これはきれいだった。あなたへの誇り。 –

0

あなたはまた、試みることができる(私が正しく私のSQLServerの構文を覚えていると仮定した場合)テーブル。 OrdersテーブルにはCustomerID ShippingDateとShipToAddressIDが含まれ、OrderDetailsにはOrderIDとProductIDが含まれます。次に、最新の注文(したがって最新の住所)を決定するためにネストされたクエリが必要になります。注文詳細を注文して商品を注文し、気になる製品をフィルタします。

1

私が注文してたOrderDetailsを持たずに、あなたがこれを行うことができますどのように表示されていない

+1

あなたは正しいですが、説明されたシナリオは、私が達成したいことを簡単に説明しようとする純粋な例です。元の質問をP.S.で更新しました。これを説明する。 –