SELECT cr.review_sk, cr.cs_sk, cr.full_name,
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
cs.cs_id, cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number
ORDER BY cs.cs_id, cr.full_name;
我找不到在同一查询中同时具有GROUP BY和ORDER BY子句的任何示例。我尝试一次从组中删除每个字段,但是仍然遇到相同的错误。
#1 楼
您必须将SELECT
的所有列都放在GROUP BY
中,或在其上使用将结果压缩为单个值的函数(例如MIN
,MAX
或SUM
)。一个简单的示例可以理解为什么会发生这种情况:假设您有一个这样的数据库:
FOO BAR
0 A
0 B
,然后运行
SELECT * FROM table GROUP BY foo
。这意味着数据库必须返回一行第一行0
作为结果来满足GROUP BY
的要求,但是现在有bar
的两个值可供选择。您会期望哪个结果-A
或B
?还是数据库应该返回多个行,从而违反GROUP BY
的合同?#2 楼
GROUP BY
子句中包括不是组函数参数的所有SELECT
表达式。 #3 楼
太糟糕了,Oracle具有这样的局限性。当然,不在GROUP BY中的列的结果将是随机的,但有时您希望这样做。愚蠢的Oracle,您可以在MySQL / MSSQL中执行此操作。但是可以解决Oracle:
,但以下行不起作用
SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;
您可以使用以下一些0来欺骗Oracle,以使您的列处于范围内,但不能按其分组(假设这些是数字,否则使用CONCAT)。
SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A);
评论
上面没有严格定义@GlennFromIowa的伪表,而且我不再为11g的公司工作,我无法提供更好的示例,尽管上次测试时这是一个问题。
–约瑟夫·欲望
2015年11月21日,0:14
出于好奇,什么时候需要随机结果的例子是什么?我想不出任何理由要按FOO分组并获得BAR的随机行。
–凯尔·布莱恩汀(Kyle Bridenstine)
17-10-17在17:48
#4 楼
如果通过包含GROUP BY
子句进行分组,则SELECT
中不是组函数(或聚合函数或聚合列)的任何表达式,例如COUNT
,AVG
,MIN
,MAX
,SUM
等(聚合函数列表) 示例(正确的方式)(此处
GROUP BY
不是组函数(非聚合列),因此它必须出现在employee_id
中。相反,sum(salary)是组函数(聚合列) ),因此不需要出现在GROUP BY
子句中。 SELECT employee_id, sum(salary)
FROM employees
GROUP BY employee_id;
示例(错误的方式)(此处
GROUP BY
不是组函数,并且它没有出现在employee_id
子句中,这将导致ORA -00979错误。 SELECT employee_id, sum(salary)
FROM employees;
要纠正,您需要执行以下操作之一:
在
GROUP BY
子句中包含SELECT
子句中列出的所有非聚合表达式从
GROUP BY
子句中删除组(聚合)功能。#5 楼
您应该执行以下操作:SELECT cr.review_sk,
cr.cs_sk,
cr.full_name,
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
cs.cs_id,
cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;
#6 楼
当在选择表达式和按表达式分组的两个位置中未同时使用UPPER或LOWER关键字时,也会出现相同的错误。错误:-
select a , count(*) from my_table group by UPPER(a) .
右:-
select UPPER(a) , count(*) from my_table group by UPPER(a) .
#7 楼
分组依据用于聚合某些数据,具体取决于聚合函数,而不是您需要将需要分组的一个或多个列放入的数据。例如:
select d.deptno, max(e.sal)
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;
这将导致部门的最高工资。
现在,如果我们从group by子句中省略
d.deptno
,则会出现相同的错误。#8 楼
除其他答案外,如果order by子句不一致,也可能导致此错误。例如:select
substr(year_month, 1, 4)
,count(*) as tot
from
schema.tbl
group by
substr(year_month, 1, 4)
order by
year_month
评论
不,您不需要将它们放在order by子句中
– Xaisoft
09年10月5日在15:10
我尝试将ORDER BY中的两列添加到GROUP BY。那行得通。谢谢!
–特蕾莎
09年10月5日在15:12
或换一种说法:如果您有两列,并按第一列分组,则意味着每个结果行的第二列中都有多个值。由于只有一个结果行,但有很多值可供选择,因此数据库应返回哪个值?第一次偶然发现?
–亚伦·迪古拉(Aaron Digulla)
09年10月8日在8:23
@AaronDigulla这就是MySQL所做的,世界并没有结束:p
–克里斯·贝克(Chris Baker)
2014年8月27日在21:32
我部分同意。但是假设以下情况:有4列:A,B,C和D。现在,我将(A,B,C)设置为组合键。然后,“选择A,B,max(C),D ...由A,B分组”就不存在歧义,因为对于A,B和C的每种组合,都已经定义了D。甲骨文仍然拒绝履行职责。
– g.a
17 Mar 6 '17 at 17:17