2009-08-15 18 views
5

Soy terrible en SQL. No sé si lo que intento hacer es posible. Pero, debido a nuestra estructura de datos, necesito resolver este problema de esta manera o hacer un cambio arquitectónico masivo.SQL - LEFT OUTER JOIN y WHERE cláusula

Estoy tratando de contar el número de 'Provincias' (a.k.a Estados) para un país. Sin embargo, hay solo unas pocas provincias que deben ser ignoradas del conteo. Debido a esto, estoy tratando de recuperar una lista de países, con un recuento de las provincias de cada país.

Como ejemplo, necesito consultar para Estados Unidos, e ignorar 'Washington D.C.' de la cuenta La razón es porque según nuestros requisitos, Washington D.C. no es un estado. Aquí es lo que estoy tratando en el momento (que no funciona):

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

Como se puede imaginar, esta consulta no devuelve ningún resultado cuando el idParameter coincide con el de los Estados Unidos.

¿Cómo obtengo el recuento correcto al calcular las excepciones? Muchas gracias por su ayuda.

Respuesta

9

Usted necesita una cláusula GROUP BY para obtener un recuento adecuado, y que necesita una combinación externa para mostrar los valores '0' para aquellos países que no tienen provincias válidos.

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

Sí. Tienes razón. Oops. –

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

¿Quién? No probado.

- Editar

caso omiso de esta; como lo sugiere el cartel de arriba, necesita un "grupo por" para trabajar.

0

¿Puedes probarlo?

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

No desea listar el texto, un error de ortografía puede causar un error difícil de ver. También desea hacerlo eventualmente para que el usuario pueda tener una página para mantener esto por sí mismo. Entonces:

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 
Cuestiones relacionadas