【问题标题】:MAX() in ORACLE SQLORACLE SQL 中的 MAX()
【发布时间】:2016-11-19 04:30:16
【问题描述】:

我有一个表,其中存储了已完成的维护任务的记录列表以及完成的日期和时间。我正在尝试进行子查询以提取具有最近日期的每个任务的记录。我的 SQL 语句是:

    SELECT "ENGINEERING_COMPLIANCE"."EO" AS "EO",
       "ENGINEERING_COMPLIANCE"."AC" AS "AC",
       "ENGINEERING_COMPLIANCE"."PN" AS "PN",
       "ENGINEERING_COMPLIANCE"."PN_SN" AS "PN_SN",
       "ENGINEERING_COMPLIANCE"."HOURS_RESET" AS "HOURS_RESET",
       "ENGINEERING_COMPLIANCE"."MINUTES_RESET" AS "MINUTES_RESET",
       "ENGINEERING_COMPLIANCE"."CYCLES_RESET" AS "CYCLES_RESET",
       "ENGINEERING_COMPLIANCE"."RESET_DATE" AS "RESET_DATE",
       "ENGINEERING_COMPLIANCE"."RESET_HOUR" AS "RESET_HOUR",
       "ENGINEERING_COMPLIANCE"."RESET_MINUTE" AS "RESET_MINUTE",
       MAX ( "ENGINEERING_COMPLIANCE"."RESET_DATE" ) AS "LAST_COMP_DATE"
  FROM ENGINEERING_COMPLIANCE
GROUP BY ( "ENGINEERING_COMPLIANCE"."EO" ) ,
       ( "ENGINEERING_COMPLIANCE"."AC" ) ,
       ( "ENGINEERING_COMPLIANCE"."PN" ) ,
       ( "ENGINEERING_COMPLIANCE"."PN_SN" )

但是我不断收到以下错误:“ORA-00979: not a GROUP BY expression”

当我删除“GROUP BY”时,我得到: "ORA-00937: 不是单组群函数"

1 - 这究竟是什么意思 2 - 声明有什么问题?

【问题讨论】:

  • 4 票赞成一个可以通过谷歌搜索轻松回答的问题? SO 确实有一个有趣的动态。
  • 这个问题可能是重复的,但没有说明我可以将它们应用于我的问题的地方。对不起,谢谢你

标签: sql oracle oracle11g max


【解决方案1】:

您在没有聚合函数的情况下在 SELECT 子句中添加的列应该在 GROUP BY 子句中。

为了清楚一点:
举个例子:

您的 SELECT 子句中有 TransactionID、AccountID、TransactionAmount、TransactionDate,并且在所有日期都需要 SUM(TransactionAmount),在这种情况下,如果您添加

SELECT TransactionDate, TransactionID, AccountID, SUM(TransactionAmount) 
FROM Table 
GROUP BY TransactionDate

然后你会得到一个错误,为什么是因为
假设您在 20160101 上有 4 笔交易,每笔交易金额为 $1000
您的预期结果将是

TransDate      TransAmt
 20140101          4000

在这种情况下,如果在 SELECT 子句中带上其他属性,例如 AccountID 和 TransactionID,它们会去哪里?这就是为什么我们必须在 SELECT 子句中包含 GROUP 子句中的所有属性,除了带有 AGGREGATE 函数的属性。

【讨论】:

  • 谢谢 - 我不再收到错误消息 - 但是我也没有得到最近的日期。是因为我要求列出的其他信息还是我遗漏了什么?我取出了“Reset_Date”,因为那是 MAX 子句中的内容,但现在我又被卡住了。感谢您在此方面的帮助
  • 你还卡住了吗?
  • 是的,我是。我只需要每个项目的最新日期,但我得到了所有日期。 :(
  • 您能否从您的选择和分组依据中删除重置日期、重置小时和重置分钟。你为什么使用重置日期和最大值(重置日期)???
【解决方案2】:

我根本不了解 MySQL,但是,在 Oracle 中,您需要按 all 选择列表中列出的非聚合函数列进行分组。

这样的事情应该可以工作:

 SELECT "engineering_compliance"."eo"               AS "EO", 
       "engineering_compliance"."ac"               AS "AC", 
       "engineering_compliance"."pn"               AS "PN", 
       "engineering_compliance"."pn_sn"            AS "PN_SN", 
       "engineering_compliance"."hours_reset"      AS "HOURS_RESET", 
       "engineering_compliance"."minutes_reset"    AS "MINUTES_RESET", 
       "engineering_compliance"."cycles_reset"     AS "CYCLES_RESET", 
       "engineering_compliance"."reset_date"       AS "RESET_DATE", 
       "engineering_compliance"."reset_hour"       AS "RESET_HOUR", 
       "engineering_compliance"."reset_minute"     AS "RESET_MINUTE", 
       Max ("engineering_compliance"."reset_date") AS "LAST_COMP_DATE" 
FROM   engineering_compliance 
GROUP  BY "engineering_compliance"."eo", 
          "engineering_compliance"."ac", 
          "engineering_compliance"."pn", 
          "engineering_compliance"."pn_sn", 
          "engineering_compliance"."hours_reset", 
          "engineering_compliance"."minutes_reset", 
          "engineering_compliance"."cycles_reset", 
          "engineering_compliance"."reset_date", 
          "engineering_compliance"."reset_hour", 
          "engineering_compliance"."reset_minute"; 

【讨论】:

    【解决方案3】:

    您必须将 SELECT 的所有列放在 GROUP BY 中

    【讨论】:

      【解决方案4】:

      你应该设置分组中的所有列

       SELECT "ENGINEERING_COMPLIANCE"."EO" AS "EO",
         "ENGINEERING_COMPLIANCE"."AC" AS "AC",
         "ENGINEERING_COMPLIANCE"."PN" AS "PN",
         "ENGINEERING_COMPLIANCE"."PN_SN" AS "PN_SN",
         "ENGINEERING_COMPLIANCE"."HOURS_RESET" AS "HOURS_RESET",
         "ENGINEERING_COMPLIANCE"."MINUTES_RESET" AS "MINUTES_RESET",
         "ENGINEERING_COMPLIANCE"."CYCLES_RESET" AS "CYCLES_RESET",
         "ENGINEERING_COMPLIANCE"."RESET_DATE" AS "RESET_DATE",
         "ENGINEERING_COMPLIANCE"."RESET_HOUR" AS "RESET_HOUR",
         "ENGINEERING_COMPLIANCE"."RESET_MINUTE" AS "RESET_MINUTE",
         MAX ( "ENGINEERING_COMPLIANCE"."RESET_DATE" ) AS "LAST_COMP_DATE"
      FROM ENGINEERING_COMPLIANCE
      GROUP BY  "ENGINEERING_COMPLIANCE"."EO"  ,
         "ENGINEERING_COMPLIANCE"."AC"  ,
         "ENGINEERING_COMPLIANCE"."PN"  ,
         "ENGINEERING_COMPLIANCE"."PN_SN" , 
         "ENGINEERING_COMPLIANCE"."HOURS_RESET" ,
         "ENGINEERING_COMPLIANCE"."MINUTES_RESET" ,
         "ENGINEERING_COMPLIANCE"."CYCLES_RESET" ,
         "ENGINEERING_COMPLIANCE"."RESET_DATE",
         "ENGINEERING_COMPLIANCE"."RESET_HOUR" ,
         "ENGINEERING_COMPLIANCE"."RESET_MINUTE"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2016-09-27
        相关资源
        最近更新 更多