2017-04-24 2 views
0

Lassen Sie uns sagen, ich habe diese 3 TabellenWie COUNT() in mehr als einer Spalte verwenden?

Countries    ProvOrStates    MajorCities     

-----+-------------  -----+-----------  -----+------------- 
Id | CountryName  Id | CId | Name  Id | POSId | Name 
-----+-------------  -----+-----------  -----+------------- 
1 | USA    1 | 1 | NY   1 | 1 | NYC 

Wie Sie so etwas wie

--------------------------------------------- 
    CountryName | ProvinceOrState | MajorCities 
       | (Count)  | (Count) 
--------------------------------------------- 
    USA  | 50    | 200 
--------------------------------------------- 
    Canada  | 10    | 57 

Bisher bekommen, so wie ich es sehe:

  • Führen Sie das erste SELECT COUNT (GROUP BY Länder.Id) Länder JOIN ProvOrStates,
  • das Ergebnis in einer Tabelle Variable,
  • Run die zweite SELECT COUNT (GROUP BY Countries.Id) auf ProvOrStatesmajorcities JOIN,
  • Aktualisieren der Tabelle mit variabler basierend auf den Countries.Id
  • Fügen Sie die Tabellenvariable mit der Tabelle Countries ON Countries.Id = Id der Tabellenvariablen hinzu.

Gibt es eine Möglichkeit, nur eine Abfrage statt mehrere intermediäre Abfragen auszuführen? Ich weiß nicht, ob es überhaupt machbar ist, da ich es ohne Glück versucht habe.

Vielen Dank für

Wenn Sie helfen
+1

Begleiten sie sie alle auf und SELECT COUNTRY, COUNT (DISTINCT UMLAND), COUNT (DISTINCT CITY) GRUPPIERE NACH COUNTRY – LoztInSpace

+0

Ihre Lösung hat funktioniert. Danke – Richard77

Antwort

0

Diese Antwort kommt von @lotzInSpace.

SELECT ct.[CountryName], COUNT(DISTINCT p.[Id]), COUNT(DISTINCT c.[Id]) 
FROM dbo.[Countries] ct 
LEFT JOIN dbo.[Provinces] p 
ON ct.[Id] = p.[CountryId] 
LEFT JOIN dbo.[Cities] c 
ON p.[Id] = c.[ProvinceId] 
GROUP BY ct.[CountryName] 

Es funktioniert. Ich verwende LEFT JOIN statt INNER JOIN weil, wenn ein Land Provinzen nicht hat, oder eine Provinz nicht über Städte, dann ist das Land oder die Provinz nicht angezeigt.

Thanks again @lotzInSpace.

+1

Mein Vergnügen. Wenn ich kein Tablet benutzt hätte, hätte ich dir diese komplette Antwort selbst gegeben. Zu viel tippen obwohl :) – LoztInSpace

0

Verwenden Sub-Abfrage oder abgeleitete Tabellen und Ansichten

Grundsätzlich Sie haben 3-Tabellen

select * from [TableOne] as T1 
join 
(
    select T2.Column, T3.Column 
    from [TableTwo] as T2 
    join [TableThree] as T3 
    on T2.CondtionColumn = T3.CondtionColumn 
) AS DerivedTable 
on T1.DepName = DerivedTable.DepName 

Und wenn Sie sind zu 100% Prozent sicher, dass es funktioniert Sie erstellen können eine Ansicht, die Ihre drei Tabellen enthält, und rufen Sie es an, wann immer Sie wollen

PS: im Falle von identischen Spaltennamen oder wenn Sie diese mes bekommen sage "Die Spalte 'ColumnName' wurde für 'Table' mehrfach angegeben. " Sie alias verwenden können, um dieses Problem zu lösen

+0

Und wo ist die Zählung? –

+0

Sie können Ihre Zählung oder jede andere Aggregat- oder Gruppierungsfunktion auf dieser Ansicht leicht ausführen ... Der Grund, warum ich sie nicht in die Ansicht eingefügt habe, ist, die Ansicht für jede andere Funktion verfügbar zu machen, die Sie später darauf verwenden möchten –

+0

Dies half mir, alle gewünschten Spalten in einem Durchgang anzuzeigen. Ich sehe jedoch immer noch nicht, wie ich etwas wie "SELECT col1, COUNT (col2), COUNT (col3) FROM ..." verwenden würde. – Richard77

Verwandte Themen