2015-04-14 2 views
-4

Мне нужна помощь с использованием UNION с группой.Запуск UNION с группой

Я написал ниже код, который дает вам обзор моего кода. Я в основном пытаюсь запустить этот код за более чем шесть месяцев с UNION.

Каждый раз, когда я запускаю приведенный ниже код, SQL SERVER жалуется на «Категория», не находящуюся в группе.

Я попытался добавить это в конце кода:

Группа по Имя ORDER BY Имя

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

Что я могу сделать, чтобы запрос выполнялся с предложением UNION?

SELECT 
    '2000' AS Year, 
    Name AS Category, 
    COUNT(id) AS X 
FROM 
(   
    (
     Select id, Name 
     From dbo.tablea 
     where something 
     GROUP BY id,name 
     HAVING SUM(X)>0 
    ) sub 

    Union 

    SELECT 
     '1999' AS Year, 
     Name AS Category, 
     COUNT(id) AS X 
    FROM 
    (   
     (
      Select id, Name 
      From dbo.tablea 
      where something 
      GROUP BY id,name 
      HAVING SUM(X)>0 
     ) sub 
+5

Ваш 'группа by' не имеет имени столбца. Исправьте код как 'group by name'. –

+0

Мне это известно. Я просто не написал его здесь, чтобы сэкономить время. –

+2

напишите свой полный запрос, чтобы найти решение –

ответ

0

Давайте посмотрим на первую часть запроса:

SELECT '2000' AS Year, Name AS Category, COUNT(id) AS X 
FROM 
(
    Select id, Name 
    From dbo.tablea 
    where ... 
    GROUP BY id, Name 
    HAVING SUM(X)>0 
) sub 

(я удалил одну открывающую скобку, которая не принадлежит там.)

Вы можете использовать агрегацию здесь (COUNT(id) , что совпадает с простым COUNT(*), поскольку идентификатор никогда не должен быть нулевым). Итак, какие другие поля вы выбираете? Литерал «2000», который в порядке, и имя. Но какое имя? МАКСИМУМ? MIN? Вы не указали это, и это то, что говорит вам СУБД. Таким образом, либо используют агрегирование по имени, например MIN(Name)или группу (путем добавления GROUP BY Name после псевдонима «под»), чтобы получить одну строку для имени.

Вот полный запрос с группами по имени:

SELECT '2000' AS Year, Name AS Category, COUNT(id) AS X 
FROM 
(
    Select id, Name 
    From dbo.tablea 
    where ... 
    GROUP BY id, Name 
    HAVING SUM(X)>0 
) sub 
GROUP BY Name 
UNION 
SELECT '1999' AS Year, Name AS Category, COUNT(id) AS X 
FROM 
(
    Select id, Name 
    From dbo.tablea 
    where ... 
    GROUP BY id, Name 
    HAVING SUM(X)>0 
) sub 
GROUP BY Name; 
Смежные вопросы