2009-04-07 16 views
36

कल्पना कीजिए मैं SqlServer में निम्नलिखित 3 टेबल है:एक बाएँ में सबसे हाल का रिकॉर्ड में शामिल होने

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

एक ग्राहक कई वितरण पते और एकाधिक उत्पादों हो सकता है।

मैं क्या करना चाहता हूं कि प्रत्येक राज्य के लिए ग्राहकों की संख्या सूचीबद्ध करें जहां राज्य सबसे हालिया पता रिकॉर्ड द्वारा निर्धारित किया जाता है। जैसे "प्रत्येक राज्य में कितने ग्राहकों को एक उत्पाद प्राप्त हुआ?"। इसलिए मुझे ग्राहक के लिए किसी भी पिछले पता रिकॉर्ड में दिलचस्पी नहीं है, केवल सबसे हालिया (पता आईडी द्वारा निर्धारित)। के रूप में एक ग्राहक से अधिक पते ग्राहक केवल सबसे हाल ही में पता रिकॉर्ड के राज्य में की जाएगी जो हो सकता है

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 

मैं सामान्य रूप से की तरह कुछ करना होगा?

पीएस उपरोक्त उन जोड़ों को आसानी से समझाने के लिए एक उदाहरण परिदृश्य है जो मैं प्राप्त करने की कोशिश कर रहा हूं और वास्तविक प्रणाली डिज़ाइन को प्रतिबिंबित नहीं करता हूं।

उत्तर

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 वाक्य रचना सही ढंग से याद है):

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

मैं आदेश और ORDERDETAILS बिना तुम ऐसा कैसे कर सकते हैं नहीं दिख रहा है टेबल। ऑर्डर तालिका में ग्राहक आईडी शिपिंग और शिपो एड्रेस आईडी शामिल होगा, और ऑर्डर डिस्प्ले में ऑर्डर आईडी और उत्पाद आईडी होगी। आपको सबसे हालिया ऑर्डर (और इसलिए सबसे हालिया पता) निर्धारित करने के लिए एक नेस्टेड क्वेरी की आवश्यकता होगी, उत्पादों को ऑर्डर करने के लिए ऑर्डर विवरण में शामिल हों, फिर उस उत्पाद पर फ़िल्टर करें जिसके बारे में आप परवाह करते हैं।

+1

आप सही हैं लेकिन वर्णित परिदृश्य पूरी तरह से एक उदाहरण है जो आसानी से समझाने की कोशिश करता है कि मैं क्या हासिल करना चाहता हूं। मैंने अपने मूल प्रश्न को पीएस के साथ अपडेट किया है यह समझाओ। –

संबंधित मुद्दे

 संबंधित मुद्दे