2009-04-07 46 views
36

Hãy tưởng tượng tôi có 3 bảng sau trong SQLServer:kỷ lục gần đây nhất trong một trái tham gia

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

Một khách hàng có thể có nhiều địa chỉ giao hàng và các sản phẩm mulitple.

Điều tôi muốn làm là liệt kê số lượng khách hàng cho mỗi Tiểu bang nơi Tiểu bang được xác định bằng bản ghi Địa chỉ gần đây nhất. Chẳng hạn như "Có bao nhiêu khách hàng cuối cùng nhận được sản phẩm ở mỗi tiểu bang?". Do đó, tôi không quan tâm đến bất kỳ bản ghi Địa chỉ nào trước đó cho Khách hàng, chỉ là Bản ghi gần đây nhất (được xác định bởi AddressID).

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

tôi thường làm một cái gì đó như:

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 

Tuy nhiên, như một khách hàng có thể có nhiều địa chỉ khách hàng sẽ chỉ được tính ở bang kỷ lục Địa chỉ gần đây nhất?

P.S. Ở trên hoàn toàn là một kịch bản ví dụ để dễ dàng giải thích các kết nối mà tôi đang cố gắng đạt được và không phản ánh một thiết kế hệ thống thực tế.

Trả lời

65

Hãy thử điều này:

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

Chỉ là những gì tôi đang tìm kiếm, cảm ơn rất nhiều. –

+0

Tuyệt vời! bây giờ, tại sao tôi không nghĩ về điều này! –

+5

Điều này thật gọn gàng. Kudos cho bạn. –

0

Bạn cũng có thể thử (giả sử tôi nhớ cú pháp SQLServer của tôi một cách chính xác):

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 
1

tôi không thấy làm thế nào bạn có thể làm điều này mà không cần phải Orders và OrderDetails những cái bàn. Bảng Đơn hàng sẽ bao gồm CustomerID ShippingDate và ShipToAddressID và OrderDetails sẽ có OrderID và ProductID. Sau đó, bạn sẽ cần một truy vấn lồng nhau để xác định thứ tự gần đây nhất (và do đó địa chỉ gần đây nhất), tham gia vào chi tiết đơn đặt hàng để có được các sản phẩm được đặt hàng, sau đó lọc trên sản phẩm mà bạn quan tâm.

+1

Bạn đúng nhưng kịch bản được mô tả hoàn toàn là một ví dụ để cố gắng giải thích dễ dàng những gì tôi muốn đạt được. Tôi đã cập nhật câu hỏi ban đầu của mình với P.S. giải thích điều này. –

Các vấn đề liên quan