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