(经典)使用group by出现错误.要注意什么? 

select * from Products group by CategoryID
我用的数据库是NorthWind

错误提示:
Msg 8120, Level 16, State 1, Line 2
Column 'Products.ProductID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

==================================================
简单来说吧。
使用group by 的时个,某个字段中相同的值将会被认为是一个,
如下表table1:
ID name
1 xiaowang
2 xiaowang
3 xx
4 bb
select name from table1 group by name
得到的结果是
xiaowang
xx
bb
也说是可以简单的认为相同情况只取一次
所以得到的表,与原来的表就存在被丢弃的现像,这样当然不能用 select * 了,
理论上这个只能与sum,count---一起用了!
也就是要读取的字段,必须也能相应的“减少”行!

==================================================
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
所以按你上面的列子应该把你所要显示的所有列名都写到
group by后

==================================================
select item.itemnum,item.in1,item.in4,inventory.location from item,inventory
where item.itemnum=inventory.itemnum
and inventory.location='DYB'
and item.in1='D/MTD/MRM'
GROUP BY ITEM.ITEMNUM
提示错误是NOT A GROUP BY EXPRESSION
那位高人能指点一下是我是那里出错了,还有GROUP BY的用法
谢谢了哈!

==================================================

GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想

你用了GROUP BY 按 ITEM.ITEMNUM 这个字段分组,那其他字段内容不同,变成一对多又改如何显示呢,比如下面所示

A B
1 abc
1 bcd
1 asdfg

select A,B from table group by A
你说这样查出来是什么结果,

A B
    abc
1 bcd
    asdfg

右边3条如何变成一条,所以需要用到聚合函数,比如

select A,count(B) 数量 from table group by A
这样的结果就是
A 数量
1 3

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

==================================================

总结      

        在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。

        在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数

select max(sal),job emp group by job;
(注意max(sal),job的job并非一定要出现,但有意义)

     
  查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。

select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;

        当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件

       where 子句的作用
是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。 
        having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

      
查询每个部门的每种职位的雇员数
select deptno,job,count(*) from emp group by deptno,job;

       group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面,并且若有order by子句,则order by后面的子句后面的列也必须出现在 group by 后面。
select  ... from ... where ... group by ... having ... order by ...  
select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;

=================================================

 

posted on 2009-06-11 22:30  钱途无梁  阅读(3938)  评论(0编辑  收藏  举报