2009-08-15 18 views
5

Ich bin schrecklich in SQL. Ich weiß nicht, ob das, was ich versuche, möglich ist. Aber aufgrund unserer Datenstruktur muss ich dieses Problem auf diese Weise lösen oder eine massive architektonische Veränderung vornehmen.SQL - LINKS OUTER JOIN und WHERE-Klausel

Ich versuche die Anzahl der "Provinzen" (a.k.a Staaten) für ein Land zu zählen. Es gibt jedoch nur wenige Provinzen, die von der Zählung ignoriert werden müssen. Aus diesem Grund versuche ich, eine Liste von Ländern mit einer Zählung der Provinzen in jedem Land zu erhalten.

Als ein Beispiel, muss ich für die Vereinigten Staaten abfragen und "Washington D. C." ignorieren von der Zählung. Der Grund dafür ist, dass Washington DC aufgrund unserer Anforderungen kein Staat ist. Hier ist, was ich im Moment versuche (es funktioniert nicht):

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

Wie Sie sich vorstellen können, diese Abfrage liefert keine Ergebnisse, wenn die idParameter entspricht dem der Vereinigten Staaten.

Wie erhalte ich in Ausnahmen die korrekte Anzahl? Vielen Dank für Ihre Hilfe.

Antwort

9

Sie benötigen einen GROUP BY Klausel eine richtige Zählung zu bekommen, und Sie benötigen einen Outer-Joins ohne gültigen Provinzen für die Länder ‚0‘ Werte anzuzeigen.

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

Ja. Du hast recht. Hoppla. –

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

Vielleicht? Nicht getestet.

- Bearbeiten

Mißachtung dieser; Wie auf dem Poster oben angedeutet, braucht es eine Gruppe, um zu arbeiten.

0

Können Sie das ausprobieren?

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

Sie möchten keinen Text auflisten, ein Tippfehler kann einen schwer erkennbaren Fehler verursachen. Sie möchten es eventuell auch so einrichten, dass der Benutzer eine Seite haben kann, um diese selbst zu verwalten. Also:

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