2011-07-15 13 views
6

posso eseguire la seguente selezione di SQL Server di (nomi o non-ripetizione) distinti da una colonna in una tabella in questo modo:SELECT COUNT (DISTINCT [name]) da diverse tabelle

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

Ma cosa succede se Ho più di una tabella (tutte queste tabelle contengono il campo nome chiamato [Nome]) e ho bisogno di conoscere il conteggio dei nomi non ripetuti in due o più tabelle.

Se corro qualcosa di simile:

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

ottengo un errore, "ambiguo nome di colonna 'Nome'".

PS. Tutte e tre le tabelle [MyTable1], [MyTable2], [MyTable3] sono un prodotto di una selezione precedente.

+0

Vuoi contare da tutte e tre le tabelle? o solo da uno di loro? – EricZ

+1

Cosa intendi con "nomi non ripetuti"? –

+0

OK, per esempio, la colonna [Nome] di MyTable1 ha valori: "John", "Mary", "John", "Aaron". La colonna [Nome] di MyTable2 ha valori: "Mary", "Aaron", "Aaron", "Mary". La colonna [Nome] di MyTable3 ha valori: "Giovanni", "Maria", "Giovanni", "Giovanni". Devo ottenere il conteggio, ad esempio: "Giovanni" = 5 volte, "Maria" = 4 volte, "Aaron" = 3 volte. – ahmd0

risposta

16

Dopo il chiarimento, uso:

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 

Se ho capito bene, l'uso:

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 rimuoverà i duplicati; UNION ALL no, ed è più veloce per questo.

+0

Penso che tu abbia coperto tutte le opzioni ora :) +1 –

+0

E, l'UNIONE TUTTO è la strada giusta da percorrere, indipendentemente dalla soluzione utilizzata :) – bobs

+0

Ragazzi, mi scuso per averlo fuorviato. Sto solo imparando SQL. Sono anche curioso, questo codice gestirà i nomi in una questione sensibile al maiuscolo/minuscolo, cioè "John" e "john" contano come 2 o come 1? – ahmd0

5

EDIT: ha dovuto cambiare dopo aver visto il commento recente.

Questo ti dà quello che vuoi? Questo dà un conteggio per ogni persona dopo aver combinato le righe di tutte le tabelle.

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

Grazie. Dovrò testarlo pure. – ahmd0

1

Ecco un altro modo:

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 
Problemi correlati