2011-07-15 31 views
6

puedo realizar la siguiente selección de SQL Server de (nombres o no repetidos) distintos de una columna en una tabla de este modo:SELECT COUNT (DISTINCT [nombre]) de varias tablas

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

Pero lo que si Tengo más de una tabla (todas estas tablas contienen el campo de nombre llamado [Nombre]) y necesito saber el recuento de nombres que no se repiten en dos o más tablas.

Si me quedo algo como esto:

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

consigo un error, "ambiguo nombre de la columna 'Nombre'".

PS. Las tres tablas [MyTable1], [MyTable2], [MyTable3] son ​​producto de una selección previa.

+0

¿Quieres contar de las tres tablas? o solo de uno de ellos? – EricZ

+1

¿Qué quiere decir con "nombres que no se repiten"? –

+0

OK, por ejemplo, la columna [Nombre] de MyTable1 tiene valores: "John", "Mary", "John", "Aaron". La columna [Nombre] de MyTable2 tiene valores: "Mary", "Aaron", "Aaron", "Mary". La columna [Nombre] de MyTable3 tiene valores: "John", "Mary", "John", "John". Necesito obtener el conteo, como: "John" = 5 veces, "Mary" = 4 veces, "Aaron" = 3 veces. – ahmd0

Respuesta

16

Después de la aclaración, el 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 

Si he entendido bien, su 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 va a eliminar duplicados; UNION ALL no lo hará, y es más rápido para él.

+0

Creo que ya cubrió todas las opciones :) +1 –

+0

Y, UNION ALL es el camino correcto, sin importar qué solución se use :) – bobs

+0

Chicos, me disculpo por engañarlos. Solo estoy aprendiendo SQL. También tengo curiosidad por saber si este código manejará los nombres en un asunto que distinga entre mayúsculas y minúsculas, es decir, "John" y "john" cuentan como 2 o como 1. – ahmd0

5

EDIT: Tuve que cambiar después de ver comentarios recientes.

¿Esto le da lo que quiere? Esto da un recuento para cada persona después de combinar las filas de todas las tablas.

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

Gracias. Tendré que probarlo también. – ahmd0

1

Ésta es otra manera:

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