【问题标题】:Oracle 11g group byOracle 11g 分组依据
【发布时间】:2017-09-21 23:44:54
【问题描述】:

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

这让我发疯。内部查询太大,无法在此处显示,但肯定有重复项,这就是我想通过外部查询消除的内容。你能帮我看看我做错了什么吗?非常感谢!

【问题讨论】:

  • 如果能提供内选查询的代码sn-p,有助于理解问题。
  • 能否请您发布完整的代码?问题可能出在内部查询中吗?
  • 奇怪,内部查询如何影响外部查询...?它应该只是外部查询的结果集,不是吗? (至少在 MySQL 中会是这样。)
  • @user2511599 请提及内部查询中的内容?
  • 假设内部查询有 A1、A2, A3` 和 A4 列,那么您的查询应该可以工作。您能否显示您正在使用的完整查询,因为您没有理由出现该错误。

标签: sql oracle oracle11g group-by


【解决方案1】:

主要问题是:您真正想要实现什么?

在内部查询中,您按 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;

但也许你想要完全不同的东西。

【讨论】:

  • 我已经更新了我的问题,希望现在更清楚了。
  • 现在的查询已经很不一样了,所以你可以把它变成一个全新的问题。我仍然想知道查询应该做什么。现在它完全按照我的查询所做的,只是通过构建一个你没有真正使用的中间组来混淆。无论如何,新查询不能再给你一个 ORA-00979 “不是 GROUP BY 表达式”了。
【解决方案2】:

在内部查询中:

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

【讨论】:

  • @user75ponic 是的,对于 3rd edit of the question(在 OP 更改问题之前),请参阅我的第二句“你有 A4 这不是 GROUP BY 表达式的一部分,也不是聚合的一部分。这就是导致您的错误的原因。”
【解决方案3】:

试试这个:

SELECT A1, A2, A3, SUM(A4) SA4
FROM (
SELECT 
 DISTINCT 
      A1
    , A2
    , A3
    , A4
FROM T1 
) a
GROUP BY A1, A2, A3

你不需要同时使用DISTINCTGROUP by

【讨论】:

    【解决方案4】:

    您确实需要 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
    

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 2021-04-11
      • 1970-01-01
      • 2015-02-04
      相关资源
      最近更新 更多