2011-07-15 18 views
6

mogę wykonać następujący wybór SQL Server odrębnych (lub nie powtarzających się nazwisk) z kolumny w jednej tabeli tak:SELECT COUNT (DISTINCT [nazwa]) z kilku tabel

SELECT COUNT(DISTINCT [Name]) FROM [MyTable] 

Ale co, jeśli Mam więcej niż jedną tabelę (wszystkie te tabele zawierają pole nazwy o nazwie [Nazwa]) i muszę znać liczbę nie powtarzających się nazw w dwóch lub więcej tabelach.

Jeśli uruchomię coś takiego:

SELECT COUNT(DISTINCT [Name]) FROM [MyTable1], [MyTable2], [MyTable3] 

pojawia się błąd: „Niejasna nazwa kolumny«Nazwa»”.

PS. Wszystkie trzy tabele [MyTable1], [MyTable2], [MyTable3] są produktem z wcześniejszego wyboru.

+0

Chcesz liczyć ze wszystkich trzech tabel? lub po prostu od jednego z nich? – EricZ

+1

Co masz na myśli przez "nie powtarzające się nazwy"? –

+0

OK, powiedzmy, kolumna [Nazwa] MyTable1 ma wartości: "Jan", "Mary", "Jan", "Aaron". W kolumnie [Name] MyTable2 znajdują się wartości: "Mary", "Aaron", "Aaron", "Mary". W kolumnie [Name] MyTable3 znajdują się wartości: "John", "Mary", "John", "John". Muszę zdobyć liczbę, taką jak: "Jan" = 5 razy, "Mary" = 4 razy, "Aaron" = 3 razy. – ahmd0

Odpowiedz

16

Po wyjaśnieniu, zastosowanie:

SELECT x.name, COUNT(x.[name]) 
    FROM (SELECT [name] 
      FROM [MyTable] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable2] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable3]) x 
GROUP BY x.name 

Jeśli dobrze rozumiem, zastosowanie:

SELECT x.name, COUNT(DISTINCT x.[name]) 
    FROM (SELECT [name] 
      FROM [MyTable] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable2] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable3]) x 
GROUP BY x.name 

UNION usunie duplikaty; UNION ALL nie będzie i jest szybszy.

+0

Wydaje mi się, że już teraz masz wszystkie opcje :) +1 –

+0

A UNION ALL to właściwa droga, bez względu na to, które rozwiązanie zostanie użyte :) – bobs

+0

Faceci, przepraszam, że wprowadzam Cię w błąd. Po prostu uczę się SQL. Jestem też ciekawy, czy ten kod będzie obsługiwał nazwy w sprawie rozróżniania wielkości liter, tj. "John" i "john" będą liczone jako 2 lub 1? – ahmd0

5

EDYCJA: Musiał się zmienić po zobaczeniu ostatniego komentarza.

Czy to daje ci to, czego chcesz? Daje to liczbę dla każdej osoby po połączeniu wierszy ze wszystkich tabel.

SELECT [NAME], COUNT(*) as TheCount 
FROM 
    (
    SELECT [Name] FROM [MyTable1] 
    UNION ALL 
    SELECT [Name] FROM [MyTable2] 
    UNION ALL 
    SELECT [Name] FROM [MyTable3] 
    ) AS [TheNames] 
GROUP BY [NAME] 
+0

Dziękuję. Będę musiał to przetestować. – ahmd0

1

Oto kolejny sposób:

SELECT x.name, SUM(x.cnt) 
FROM (SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable] 
     GROUP BY [name] 
    UNION ALL 
     SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable2] 
     GROUP BY [name] 
    UNION ALL 
     SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable3] 
     GROUP BY [name] 
    ) AS x 
GROUP BY x.name