ora-00979 不是group by 表达式

partys 2010-10-13 02:19:42
SQL 语句 如下
SELECT CFC.CUST_CODE, CFC.REF_NO, CFC.OWNER_CODE, CUST.COMP_REF_NO
FROM SCMS.CFC_MASTER_FOR_USER_ROLE CFC, SCMS.CUSTOMER CUST
WHERE CFC.STATUS = '在线'
AND CFC.OWNER_CODE = 'DATANG'
AND CUST.CUST_CODE = CFC.CUST_CODE
group by CFC.ref_no,
CFC.cust_code,
CFC.owner_code,
CFC.status,
CFC.department_code
ORDER BY CFC.CUST_CODE ASC, CFC.REF_NO ASC
报 ora-00979 不是group by 表达式(红色部分)
在group by 语句中加上CUST.COMP_REF_NO 就不报错了 为什么啊?
...全文
1351 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
partys 2010-10-13
数据库查询时对多个字段group by 有什么作用?在线等
悬赏分:30 - 解决时间:2010-7-2 10:13
对一个字段group by获得分组数据这个能理解,但是对多个字段分组,查询的结果却差不多,就是顺序不同了而已.
那么分组的这多个字段,只有一个才是主分组字段,其余的都起了排序的作用呢?
问题补充:PS:vinson_shen

按照你的解释理解,多字段分组更像是一层层的分解.

但是,实际效果是:

group by a,b,c 获得的数据集合和group by c order by a,b,c 获得的数据集合是一样的.

虽然他们的执行方式不同,但是结果却一样.

提问者: sunyundonged - 七级最佳答案"group by 字段列表"

表示根据后面的字段来分组,如果只有1个字段,那只是根据这个字段的值来进行一次分组就可以了;若后面有多个字段,那表示根据多字段的值来进行层次分组,分组层次从左到右,即先按第1个字段分组,然后在第1个字段值相同的记录中,再根据第2个字段的值进行分组;接着第2个字段值相同的记录中,再根据第3个字段的值进行分组......依次类推。

3回答者: vinson_shen - 六级
回复
partys 2010-10-13
[Quote=引用 16 楼 partys 的回复:]
SQL中GROUP BY的用法
悬赏分:20 - 解决时间:2007-8-28 16:55
select item.itemnum,item.in1,item.in4,inventory.location from item,inventory
where item.itemnum=inventory.itemnum
and inventory.location='DYB'
and……
[/Quote]简单明了
回复
partys 2010-10-13
SQL中GROUP BY的用法
悬赏分:20 - 解决时间:2007-8-28 16:55
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的用法
谢谢了哈!

提问者: wanlp01071329 - 二级最佳答案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 后面
这个是正解
回复
yjc595760907 2010-10-13
没有矛盾啊,用了group by就必须遵循这个规则,要么改为聚合函数,要么这个字段必须出现在 group by 后面,除非你不用group by
回复
partys 2010-10-13
分组啊
[Quote=引用 13 楼 jia20003 的回复:]
没有使用聚合函数,你用group by来做什么用呢!
[/Quote]
回复
gloomyfish 2010-10-13
没有使用聚合函数,你用group by来做什么用呢!
回复
partys 2010-10-13
[Quote=引用 9 楼 yjc595760907 的回复:]
不符合group by的语法,group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
[/Quote]
聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。 貌似你说的和这句话矛盾
回复
yjc595760907 2010-10-13
Transact-SQL 编程语言提供下列聚合函数:  
 AVG MAX   BINARY_CHECKSUM MIN   CHECKSUM SUM   CHECKSUM_AGG STDEV   COUNT STDEVP   COUNT_BIG VAR   GROUPING VARP
回复
partys 2010-10-13
聚合函数 什么意思 大虾?[Quote=引用 9 楼 yjc595760907 的回复:]
不符合group by的语法,group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
[/Quote]
回复
yjc595760907 2010-10-13
不符合group by的语法,group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
回复
partys 2010-10-13
难道说select 出来的值都要group by 吗?
比如 select studentname from student 必须要 group by studentname 吗? 显然不是啊[Quote=引用 7 楼 partys 的回复:]
只需查出值就行了 没有必要分组啊

引用 5 楼 andesen 的回复:
不group by CUST.COMP_REF_NO 分组
那这个字段在数据行中统计有什么意义
[/Quote]
回复
partys 2010-10-13
只需查出值就行了 没有必要分组啊 [Quote=引用 5 楼 andesen 的回复:]
不group by CUST.COMP_REF_NO 分组
那这个字段在数据行中统计有什么意义
[/Quote]
回复
BearKin 2010-10-13
[Quote=引用 4 楼 magong 的回复:]

分组统计查询中,查询目标字段要么是分组依据,要么是统计函数,要么是常量,否则非法
[/Quote]

+1
回复
andesen 2010-10-13
不group by CUST.COMP_REF_NO 分组
那这个字段在数据行中统计有什么意义
回复
magong 2010-10-13
分组统计查询中,查询目标字段要么是分组依据,要么是统计函数,要么是常量,否则非法
回复
partys 2010-10-13
快来抢分正解给分30
回复
partys 2010-10-13
难道没有牛人?我不相信
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2010-10-13 02:19
社区公告
暂无公告