Oracle 11g组由

时间:2017-04-25 05:46:23

标签: sql oracle oracle11g group-by

我是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表达式”

它让我发疯了。内部查询太大了,无法显示在这里,但肯定有重复,而这就是我想用外部查询消除的内容。你能帮我解决一下我做错了什么吗?非常感谢你!

4 个答案:

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

您无需一起使用DISTINCTGROUP 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;

但也许你想要别的东西。