2009-04-27 17 views
5

मैं दो अलग-अलग तालिकाओं से उत्पाद का नाम और इसकी बिक्री की संख्या प्राप्त करने का प्रयास कर रहा हूं।COUNT क्लास में SQL केस विवरण

मेरे टेबल कुछ इस तरह दिखाई:

BOOK 
Book_ID | Book_Title | Book_Author 

SOLD 
Transaction_ID | Book_ID | Customer_ID 

मैं परिणाम के सबसे निम्न क्वेरी

SELECT b.Book_Title, COUNT(s.Book_ID) FROM Book b, Sold s 
WHERE b.Book_ID = s.Book_ID 
GROUP BY b.Book_Title; 

हालांकि से मैं चाहता हूँ प्राप्त कर सकते हैं, कम से कम एक बिक्री के साथ यह केवल प्रदर्शित करता है उत्पादों। मैं सभी उत्पादों को प्रदर्शित करना चाहता हूं, अगर कोई बिक्री नहीं हुई है तो बस शून्य दिखा रहा है। मैं चारों ओर कुछ इस तरह के साथ खिलवाड़ किया गया है:

SELECT b.Book_Title, 
     COUNT(CASE WHEN s.Book_ID IS NULL THEN 0 ELSE s.Book_ID END) 
FROM Book b, Sold s WHERE b.Book_ID = s.Book_ID GROUP BY Book_Title; 

लेकिन WHERE खंड 1 या अधिक की बिक्री के साथ लोगों के लिए परिणामों को सीमित कर रहा है।

क्या कोई इस के आसपास एक तरीका सुझा सकता है? मैं ओरेकल 10 जी का उपयोग कर रहा हूँ।

धन्यवाद

उत्तर

9

एक छोड़ दिया बाहरी का उपयोग शामिल हो:

SELECT b.Book_Title, COUNT(s.Book_ID) 
FROM Book b left outer join Sold s on b.Book_ID = s.Book_ID 
GROUP BY b.Book_Title; 
+0

धन्यवाद, यह काम किया है :) –

+0

ध्यान दें कि COUNT() वास्तव में गैर-शून्य मानों की संख्या की गणना कर रहा है, यही कारण है कि यह काम करता है। –

-1

किताब से एक अन्य में शामिल होने के बेचा जा सकता है। आपको अभी भी गिनती के लिए शून्य मिल सकती है, लेकिन आप उस पर शीर्ष पर एक एनवीएल जोड़कर हल कर सकते हैं ...

0

जैसा कि @ विन्सेंट ने कहा, आपको बाहरी शामिल होने की आवश्यकता है। मैंने हाल ही में ओरेकल के साथ बहुत कुछ नहीं किया है, लेकिन इसका स्वामित्व बाहरी सिंटैक्स में शामिल है बल्कि विचित्र है। (मैं नहीं पता है कि क्या वे उस पर एएनएसआई साथ पकड़ा गया है।)

मालिकाना वाक्य रचना है:

SELECT b.Book_Title, 
     COUNT(s.Book_ID) 
    FROM Book b, 
     Sold s 
    WHERE b.Book_ID = s.Book_ID (+) 
GROUP BY b.Book_Title; 
0

आप एक सबक्वेरी में गिनती मिलना चाहिए और बाहरी छोड़ दिया इस तरह के रूप में यह करने के लिए शामिल हो :

select b.book_title, 
    case when s.book_id is null then 0 
     else s.salesCount end as Sales 
from book b 
left outer join 
    (select count(*) as salesCount, book_id from sales group by book_id) s on b.book_id = s.book_id 
1

तुम भी select खंड में एक सहसंबद्ध सबक्वेरी उपयोग कर सकते हैं:

select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b 

या तो group by या outer join एस की आवश्यकता नहीं है, जो बहुत बड़ी संख्या में पंक्तियों के लिए धीमा हो सकता है।

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