我是Oracle新手,对MySQL有点了解。我想做这个工作:
SELECT A1, A2, A3, SUM(A4) SA4
FROM (
SELECT A1
, A2
, A3
, A4
FROM T1
GROUP BY A1, A2, A3, A4, A5, A6, A7, A9, A10, A11, A12 ...
) a
GROUP BY A1, A2, A3
我很确定它会在MySQL中运行,但在Oracle中我遇到以下错误:
它让我发疯了。内部查询太大了,无法显示在这里,但肯定有重复,而这就是我想用外部查询消除的内容。你能帮我解决一下我做错了什么吗?非常感谢你!ORA-00979“不是GROUP BY表达式”
答案 0 :(得分:0)
对于内部查询,您确实需要group by,因此请执行
SELECT a1,
a2,
a3,
SUM (a4) sa4
FROM (SELECT DISTINCT NULL a1,
NULL a2,
NULL a3,
NULL a4
FROM t1) a
GROUP BY a1, a2, a3
答案 1 :(得分:0)
在内部查询中:
SELECT DISTINCT A1
, A2
, A3
, A4
FROM T1
GROUP BY A1, A2, A3
您A4
不是GROUP BY
表达式的一部分,也不是聚合的一部分。这就是你的错误。
将您的查询更改为:
SELECT A1, A2, A3, SUM(A4) SA4
FROM (
SELECT DISTINCT A1, A2, A3, A4
FROM T1
) a
GROUP BY A1, A2, A3
但是,您可以将此(删除内部查询)简化为:
SELECT A1, A2, A3, SUM(DISTINCT A4) SA4
FROM T1
GROUP BY A1, A2, A3
答案 2 :(得分:0)
试试这个:
SELECT A1, A2, A3, SUM(A4) SA4
FROM (
SELECT
DISTINCT
A1
, A2
, A3
, A4
FROM T1
) a
GROUP BY A1, A2, A3
您无需一起使用DISTINCT
和GROUP by
答案 3 :(得分:0)
主要问题是:你想要实现什么目标?
在内部查询中,您按A1,A2,A3分组,因此每个A1 / A2 / A3组合获得一行。所有这些列都在选择列表中。所以每一行都不同,因为它们都有不同的A1 / A2 / A3组合。一个人使用DISTINCT
从结果中删除重复项,但在您的情况下,不会出现重复项,因此DISTINCT
在这里完全是多余的。
然后你选择A4,但是当你按A1,A2,A3分组时,你通常需要决定你想要的A4。
如果A4依赖于A1,A2,A3或其组合(例如员工编号上的员工姓名,即由其编号标识的员工只有一个名称),我们在谈论的是一个A4,查询将根据SQL标准有效。因此,MySQL允许您编写查询,但不幸的是Oracle仍然坚持要为该组指定您想要的A4。好吧,如果只有一个,你可以使用MIN(A4)或MAX(A4)来满足Oracle。
但是,如果A4不依赖于A1,A2,A3或其组合(例如员工编号不依赖于部门,因为每个部门存在多个员工),则查询无效。然而,MySQL用于允许此查询并且将返回任意选择的A4(就像任意选择某个部门的一名员工一样)。这通常会导致初学者编写错误的查询。
最后再次按A1,A2,A3分组,这是完全多余的,因为数据已经按A1,A2,A3分组。你将每组的A4值相加,当然这也就是值本身。
可能你只想要每A1,A2,A3的A4总和,这将是
SELECT A1, A2, A3, SUM(A4) AS SA4
FROM T1
GROUP BY A1, A2, A3;
但也许你想要别的东西。