ВЫБЕРИТЕ COUNT (DISTINCT [имя]) из нескольких таблиц - PullRequest
6 голосов
/ 15 июля 2011

Я могу выполнить следующий выбор SQL Server различных (или неповторяющихся имен) из столбца в одной таблице следующим образом:

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

Но что если у меня более одной таблицы (всеТаблицы содержат поле имени с именем [Имя]), и мне нужно знать количество неповторяющихся имен в двух или более таблицах.

Если я запусту что-то вроде этого:Я получаю сообщение об ошибке «Неоднозначное имя столбца« Имя »».

PS.Все три таблицы [MyTable1], [MyTable2], [MyTable3] являются продуктом предыдущего выбора.

Ответы [ 3 ]

17 голосов
/ 15 июля 2011

После уточнения используйте:

  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

Если я правильно понимаю, используйте:

  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 удалит дубликаты; UNION ALL не будет, и быстрее для него.

5 голосов
/ 15 июля 2011

EDIT: пришлось изменить после просмотра недавнего комментария.

Это дает вам то, что вы хотите?Это дает счет для каждого человека после объединения строк из всех таблиц.

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]
1 голос
/ 15 июля 2011

Вот еще один способ:

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