2009-04-27 20 views
5

Tôi đang cố gắng lấy tên sản phẩm và số lượng bán hàng của sản phẩm từ hai bảng riêng biệt.TÌNH TRẠNG TRƯỜNG HỢP SQL trong COUNT CLAUSE

bảng của tôi giống như thế này:

BOOK 
Book_ID | Book_Title | Book_Author 

SOLD 
Transaction_ID | Book_ID | Customer_ID 

tôi có thể nhận được hầu hết các kết quả tôi muốn từ truy vấn sau đây

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; 

Tuy nhiên, điều này chỉ hiển thị sản phẩm với ít nhất một bán. Tôi muốn hiển thị tất cả các sản phẩm, chỉ cần hiển thị số không nếu không có doanh số bán hàng nào xảy ra. Tôi đã rối tung xung quanh với một cái gì đó như thế này:

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; 

Nhưng mệnh đề WHERE được hạn chế kết quả cho những người thân với 1 hoặc bán hàng nhiều hơn.

Có ai có thể đề xuất một cách để giải quyết vấn đề này không? Tôi đang sử dụng Oracle 10g.

Cảm ơn

Trả lời

9

sử dụng một trái bên ngoài tham gia:

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

Cảm ơn, đã thực hiện công việc :) –

+0

Lưu ý rằng COUNT() thực sự đang đếm số giá trị không null, đó là lý do tại sao tính năng này hoạt động. –

-1

thực hiện một khác tham gia từ cuốn sách để bán. bạn vẫn có thể nhận được số không cho số, nhưng bạn giải quyết điều đó bằng cách thêm NVL lên trên ...

0

Như @Vincent cho biết, bạn cần tham gia bên ngoài. Tôi đã không làm việc nhiều với Oracle gần đây, nhưng cú pháp tham gia bên ngoài độc quyền của nó là khá kỳ lạ. (Tôi không biết liệu họ đã bắt kịp với ANSI về điều đó.)

Cú pháp độc quyền là:

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

Bạn nên lấy số liệu trong một subquery và để lại bên ngoài tham gia với nó như vậy :

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

Bạn cũng có thể sử dụng một subquery tương quan trong select khoản:

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

Nó không cần group by hoặc outer join s, có thể chậm đối với số hàng rất lớn.

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