2017-01-26 10 views
2

Я работаю над тем, как работает функция UNION в SQL Server.Объединение нескольких запросов с использованием функции count

У меня есть запрос, который направляется в одной таблице:

SELECT Category, COUNT(*) AS Number 
FROM Table1 
GROUP BY Category; 

Это возвращает количество записей для каждой отдельной строки в Category колонки.

У меня есть несколько таблиц, которые организованы этим столбцом Category, и я хотел бы иметь возможность получать результаты для каждой таблицы, возвращаемой одним запросом.

Похоже, что UNION выполнит то, что я хочу, но так, как я пытался реализовать запрос, не работает с COUNT(*).

SELECT * 
FROM (SELECT Table1.Category 
       Table1.COUNT(*) AS Number 
     FROM dbo.Table1 
     UNION 
     SELECT Table2.Category 
       Table2.COUNT(*) AS Number 
     FROM dbo.Table2) AS a 
GROUP BY a.Category 

Я уверен, что есть очевидная причина, почему это не работает, но может кто-нибудь указать на то, что это такое, и как я мог бы сделать то, что я пытаюсь сделать?

ответ

2

Вы не можете написать общий договор Group by для двух разных select's. Вы должны использовать Group by условие для каждого select

SELECT TABLE1.Category, --missing comma here 
     COUNT(*) as Number -- Remove TABLE1. alias name 
FROM dbo.TABLE1 
GROUP BY Category 
UNION ALL --UNION 
SELECT TABLE2.Category, --missing comma here 
     COUNT(*) as Number -- Remove TABLE1. alias name 
FROM dbo.TABLE2 
GROUP BY Category 

Если вы действительно хотите, чтобы удалить дубликаты в результате то изменить UNION ALL к UNION

+0

Я все равно получаю ту же ошибку. 'Некорректный синтаксис рядом с * * '' – Neal

+0

@Neal Copy вставьте мой запрос и выполните его, вы никогда не получите эту ошибку. Отсутствует запятая после 'Table1.category' –

+0

Я сделал первый раз, и я сделал это только сейчас, и произошла ошибка. – Neal

1

COUNT, поскольку любая связанная функция агрегации должна иметь указанную команду GROUP BY. Вы должны использовать группу, для каждого суб запроса отдельно:

SELECT * FROM (
    SELECT TABLE1.Category, 
      COUNT(*) as Number 
    FROM dbo.TABLE1 
    GROUP BY TABLE1.Category 
    UNION ALL 
    SELECT TABLE2.Category, 
      COUNT(*) as Number 
    FROM dbo.TABLE2 
    GROUP BY TABLE2.Category 
) as a 

Лучше использовать UNION ALL против UNION - UNION устраняет дубликаты из наборов результатов, так как - скажем - вы хотите, чтобы объединить оба результата, как они безопаснее использовать UNION ALL

+0

я все еще получаю ту же ошибку. 'Неверный синтаксис рядом с '*'' – Neal

+0

Пропустил этот. COUNT - это функция sql-сервера, а не часть таблицы. Вы не используете TABLE1.COUNT (*), но можете использовать COUNT (TABLE1. *) –

+0

Я заменил 'COUNT (*)' на 'COUNT (TABLE1.)': 'Неверный синтаксис рядом ')'' – Neal