聚合函数中的列,但sqlserver表示不是

时间:2011-05-30 08:16:35

标签: sql-server-2000 aggregate-functions

我尝试运行以下查询:

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 个答案:

答案 0 :(得分:3)

当您在该列上使用聚合时,不再是c而是“聚合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不可用?

在语句中我们使用子句group by,我们的原始表格转换为新的临时表格。

在您使用a和b列进行分组的情况下,这些列中的数据不会仅限于唯一更改。

c列上,您正在使用一个函数,对于每个唯一的组,它将检索c的最低值,为此,必须创建一个新列来存储该结果。

order by子句是通过select部分执行的查询的最后一部分。所以临时表的结果不是源表的结果。

语句执行的简单顺序如下:

FORM 
 JOIN
WHERE
GROUP BY 
HAVING 
SELECT 
ORDER BY 

答案 1 :(得分:0)

试试这个

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

答案 2 :(得分:0)

试试这个:

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