2009-08-15 22 views
5

Jestem okropny w SQL. Nie wiem, czy to, co próbuję zrobić, jest możliwe. Jednak ze względu na naszą strukturę danych, muszę rozwiązać ten problem w ten sposób lub dokonać ogromnej zmiany architektonicznej.SQL - LEFT OUTER JOIN i WHERE klauzula

Próbuję policzyć liczbę "Prowincji" (a.k.a States) dla kraju. Jest jednak kilka prowincji, które należy zignorować. Z tego powodu staram się znaleźć listę krajów z liczbą prowincji w każdym kraju.

Jako przykład muszę zapytać o Stany Zjednoczone i zignorować "Washington D.C." z hrabiego. Powodem tego jest fakt, że według naszych wymagań Waszyngton nie jest państwem. Oto, co próbuję w tej chwili (nie działa):

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.' 

Jak można sobie wyobrazić, to zapytanie nie zwraca żadnych wyników, gdy idParameter mecze, które w Stanach Zjednoczonych.

Jak uzyskać prawidłową liczbę podczas obliczania wyjątków? Bardzo ci dziękuje za pomoc.

Odpowiedz

9

Musisz GROUP BY klauzulę, aby uzyskać właściwą liczbę, i trzeba zewnętrzną dołączyć do wyświetlania wartości „0” dla tych krajach nie ma ważnych prowincji.

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

Tak. Masz rację. Ups. –

-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') 

Może? Nie testowany.

- Edytuj

Lekceważyć to; jak sugeruje powyższy plakat, potrzebuje pracy "grupa po".

0

Czy możesz spróbować?

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

Nie chcesz wyświetlać tekstu, literówka może spowodować, że błąd będzie niewidoczny. W końcu chcesz to zrobić, aby użytkownik mógł mieć stronę, aby to utrzymać. A więc:

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