2009-04-07 26 views
36

ben SqlServer aşağıdaki 3 tablolar düşünün katılmak:En yeni rekor

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

Bir müşterinin birden fazla teslimat adreslerini ve mulitple ürünler olabilir.

Yapmak istediğim, Devletin en son Adres kaydı tarafından belirlendiği her bir Devlet için müşteri sayısını listelemektir. "Her bir eyalette kaç müşteriye son ürün alındı?" Gibi. Bu nedenle, Müşteri için önceki herhangi bir adres kaydıyla ilgilenmiyorum, sadece en son (AddressID tarafından belirlenir). Müşteri Müşteri yalnızca en son adres kaydının Devlette sayılır birden Adresleri olabileceğinden, Ancak

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 

Normalde böyle bir şey yapsın?

P.S. Yukarıdaki, elde etmeye çalıştığım birleşimleri kolayca açıklamak ve gerçek bir sistem tasarımını yansıtmamak için sadece bir örnek senaryodur.

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 

cevap

65

bu deneyin:

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

Sadece aradığım şey, çok teşekkürler. –

+0

Harika! şimdi, neden bunu düşünmedim? –

+5

Bu temizdi. Sana şükürler olsun. –

0

Şunu da deneyebilirsiniz (Ben doğru benim SQLServer sözdizimi hatırlamak varsayarak) tablolar. Siparişler tablosu, CustomerID ShippingDate ve ShipToAddressID'yi içerir ve OrderDetails, OrderID ve ProductID'ye sahip olur. En son siparişi (ve dolayısıyla en son adres) belirlemek için iç içe geçmiş bir sorguya ihtiyacınız olacak, ürünleri sipariş etmek için sipariş ayrıntılarına dahil olacaksınız, ardından ilgilendiğiniz ürüne filtre uygulayacaksınız.

1

Ben Siparişler ve ORDERDETAILS kalmadan bunu nasıl görmüyorum

+1

Doğru, ancak açıklanan senaryo, elde etmek istediklerimi kolayca açıklamaya çalışmak için sadece bir örnektir. Orijinal sorumu bir P.S. bunu açıklamak. –

İlgili konular