2009-08-15 17 views
5

Sono pessimo con SQL. Non so se quello che sto cercando di fare è possibile. Ma, a causa della nostra struttura dati, ho bisogno di risolvere questo problema in questo modo o di fare un enorme cambiamento architettonico.SQL - LEFT OUTER JOIN e WHERE clausola

Sto cercando di contare il numero di "Province" (Stati Uniti) per un Paese. Tuttavia, ci sono solo alcune province che devono essere ignorate dal conteggio. Per questo motivo, sto cercando di recuperare un elenco di paesi, con un conteggio delle province in ogni paese.

Come esempio, ho bisogno di interrogare per gli Stati Uniti e di ignorare "Washington D.C." dal conteggio. Il motivo per cui è dovuto alle nostre esigenze, Washington D.C. non è uno stato. Ecco che cosa sto provando in questo momento (che non funziona):

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

Come potete immaginare, questa query non restituisce alcun risultato quando l'idParameter corrisponde a quello degli Stati Uniti.

Come si ottiene il conteggio corretto durante la visualizzazione delle eccezioni? Grazie mille per il tuo aiuto.

risposta

9

Hai bisogno di un clausola di GROUP BY per ottenere un conteggio corretto, ed è necessario un outer join per visualizzare i valori '0' per i paesi senza province valide.

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ì. Hai ragione. Ops. –

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

Forse? Non testato.

- Modifica

Ignorare questo; come suggerito dal poster sopra, ha bisogno di un 'gruppo per' per funzionare.

0

Puoi fare un tentativo?

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

Non si desidera elencare il testo, un errore di battitura può causare un bug difficile da vedere. Inoltre, vuoi anche farlo in modo che l'utente possa avere una pagina per mantenerla autonomamente. Quindi:

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