linesize example sql oracle oracle11g max

sql - example - size line oracle



MAX() en ORACLE SQL (4)

Debe poner todas las columnas de SELECT en el GROUP BY

Tengo una tabla que almacena una lista de registros para las tareas de Mantenimiento que se han realizado y la fecha y hora en que se realizaron. Intento hacer una subconsulta para extraer los registros de cada tarea que tenga la fecha más reciente. Mi declaración de SQL es:

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" )

Sin embargo sigo recibiendo el siguiente error: "ORA-00979: no es una expresión GROUP BY"

Cuando elimino el "GROUP BY" obtengo: "ORA-00937: no es una función de grupo de un solo grupo"

1 - ¿qué significa eso exactamente 2 - qué está mal con la declaración?


Debes configurar todas las columnas en el grupo

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"


Las columnas que haya agregado en la cláusula SELECT sin una función agregada deben estar en la cláusula GROUP BY.

Para dejarlo un poco claro:
Toma este ejemplo:

Tiene TransactionID, AccountID, TransactionAmount, TransactionDate en su SELECT Clause, y necesita SUM (TransactionAmount) en todas las fechas, en ese caso, si agrega

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

Entonces obtendrá un error, ¿por qué?
Supongamos que tiene 4 transacciones en 20160101 y que cada transacción es $ 1000
Su expectativa de resultado será

TransDate TransAmt 20140101 4000

En este caso, si traes otros atributos en la cláusula SELECT como AccountID e ID de transacción, ¿dónde irán? Esta es la razón por la cual tenemos que incluir todos los atributos en la Cláusula GROUP lo que sea en la cláusula SELECT, excepto en el que está con la función AGGREGATE.


No conozco MySQL en absoluto, sin embargo, en Oracle, debe agrupar por todas las columnas de funciones no agregadas que figuran en la lista de selección.

Algo como esto debería funcionar:

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";