Столбец в статистической функции, но sqlserver говорит, что это не так - PullRequest
1 голос
/ 30 мая 2011

Я попытался выполнить следующий запрос:

select a,b,min(c) from tablename where e=1 and f=1 group by a,b order by a,b,c

Но получил ошибку:

Column name 'tablename.c' is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

Однако c содержится в статистической функции min (), так в чем же проблемаВот?Есть ли обходной путь?

Это на sqlserver 2000 (с помощью консоли управления sqlserver 2008).

Ответы [ 3 ]

3 голосов
/ 30 мая 2011

Поскольку вы используете агрегирование для этого столбца, это уже не c, а "агрегированный с", поэтому вы не можете использовать его в предложении order by.

Вам необходимо присвоить этому столбцу псевдоним, чтобы использовать его по порядку:

select a,b,min(c) as min_c from tablename where e=1 and f=1 group by a,b order by a,b,min_c

РЕДАКТИРОВАТЬ:

Почему столбец c недоступен?

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

В вашем случае вы использовали столбцы a и b для группировки, данные в этих столбцах не будут изменены, а будут ограничены уникальными.

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

Предложение order by - это последняя часть запроса, которая выполняется в секции select.Таким образом, результат временной таблицы не является исходной.

Простой порядок выполнения операторов выглядит следующим образом:

FORM 
 JOIN
WHERE
GROUP BY 
HAVING 
SELECT 
ORDER BY 
0 голосов
/ 30 мая 2011

попробуйте это:

select a,b,min(c) 
from tablename 
where e=1 and f=1 
group by a,b 
order by a,b,min(c)

или это:

select a,b,min(c) 
from tablename 
where e=1 and f=1 
group by a,b
order by 1,2,3
0 голосов
/ 30 мая 2011

попробуйте

select * from
(
  select a,b,min(c) as c from tablename where e=1 and f=1 group by a,b 
) d order by a,b,c
...