2009-08-15 43 views
5

Tôi khủng khiếp với SQL. Tôi không biết liệu những gì tôi đang cố làm là có thể. Nhưng, do cấu trúc dữ liệu của chúng tôi, tôi cần phải giải quyết vấn đề này theo cách này hoặc thực hiện một thay đổi kiến ​​trúc lớn.SQL - LEFT OUTER JOIN và mệnh đề WHERE

Tôi đang cố gắng đếm số 'Tỉnh' (a.k.a States) cho Quốc gia. Tuy nhiên, chỉ có một vài tỉnh mà cần phải được bỏ qua từ đếm. Bởi vì điều này, tôi đang cố gắng lấy một danh sách các quốc gia, với số lượng các tỉnh ở mỗi quốc gia.

Ví dụ: tôi cần truy vấn Hoa Kỳ và bỏ qua 'Washington D.C.' từ số lượng. Lý do tại sao là bởi vì theo yêu cầu của chúng tôi, Washington D.C. không phải là một tiểu bang. Đây là những gì tôi đang cố gắng tại thời điểm này (nó không hoạt động):

SELECT 
    c.Name AS 'CountryName', 
    ISNULL(COUNT(p.[ID]), 0) as 'ProvinceCount' 
FROM 
    Country c LEFT OUTER JOIN [Province] p ON p.[CountryID]=c.[ID] 
WHERE 
    c.[ID][email protected] and 
    p.[Name] <> 'Washington D.C.' 

Như bạn có thể hình dung, truy vấn này không trả lại bất kỳ kết quả nào khi thông số idParameter khớp với Hoa Kỳ.

Làm cách nào để nhận số đếm chính xác trong khi tìm ra ngoại lệ? Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn.

Trả lời

9

Bạn cần một mệnh đề GROUP BY để nhận số tiền thích hợp và bạn cần tham gia ngoài để hiển thị giá trị '0' cho những quốc gia không có tỉnh hợp lệ.

select 
    c.Name as 'CountryName', 
    isnull(count(c.Name), 0) as 'ProvinceCount' 
from 
    Country c 
left outer join 
    Province p on 
    p.CountryID = c.[ID] 
where 
    c.[ID] = @idParameter 
    and p.[Name] not in ('Washington D.C', 'Another State') 
group by 
    c.Name 
+0

Có. Bạn đúng. Rất tiếc. –

-2
select 
    c.name as 'country name' 
    isnull(count(p.[ID]), 0) as 'provice count' 
from 
    Country c 
inner join 
    Province p on 
    p.CountryID = c.[ID] 
where 
    c.[ID] = @idParameter 
    and 
    p.[Name] not in ('Washington D.C', 'Another State') 

Có thể? Không được kiểm tra.

- Chỉnh sửa

Bỏ qua điều này; theo đề xuất của người đăng ở trên, cần có 'nhóm' để làm việc.

0

Bạn có thể dùng thử không?

SELECT 
    c.Name AS 'CountryName', 
    ISNULL(COUNT(*), 0) as 'ProvinceCount' 
FROM 
    Country c LEFT OUTER JOIN Province p ON p.CountryID=c.ID and p.Name <> 'Washington D.C.' 
WHERE 
    [email protected] 
GROUP BY c.Name 
3

Bạn không muốn liệt kê văn bản, lỗi chính tả có thể gây khó khăn khi xem lỗi. Bạn cũng muốn cuối cùng làm cho nó để người dùng có thể có một trang để duy trì này mình. Vì vậy:

ALTER TABLE Province 
ADD IsState bit 
GO 

UPDATE Province 
set IsState = 1 
where Name not in ('Washington D.C', 'Another State') 
GO 

UPDATE Province 
SET IsState = 0 
WHERE IsState IS NULL 
GO 

-- double check the data at this point by browsing it... 

SELECT c.name AS 'country name', 
isnull(count(1), 0) AS 'provice count' 
FROM Country c 
INNER JOIN Province p 
ON p.CountryID = c.[ID] 
WHERE c.[ID] = @idParameter 
AND p.IsState = 1 
GROUP BY c.name 
ORDER BY 1 
GO 
Các vấn đề liên quan