sql - ejemplos - oracle error 00979 not a group by expression
ORA-00979 no es un grupo por expresión (7)
Estoy obteniendo ORA-00979 con la siguiente consulta:
SELECT cr.review_sk, cr.cs_sk, cr.full_name,
tolist(to_char(cf.fact_date, ''mm/dd/yyyy'')) "appt",
cs.cs_id, cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like ''%'' || UPPER(i_cs_id) || ''%''
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number
ORDER BY cs.cs_id, cr.full_name;
No pude encontrar ningún ejemplo que tuviera las cláusulas GROUP BY y ORDER BY en la misma consulta. Intenté eliminar cada campo del grupo de a uno por vez, pero sigo recibiendo el mismo error.
Debe colocar todas las columnas de SELECT
en GROUP BY
o usar funciones en ellas que comprimen los resultados en un solo valor (como MIN
, MAX
o SUM
).
Un simple ejemplo para entender por qué sucede esto: imagina que tienes una base de datos como esta:
FOO BAR
0 A
0 B
y ejecuta SELECT * FROM table GROUP BY foo
. Esto significa que la base de datos debe devolver una sola fila como resultado con la primera columna 0
para cumplir con GROUP BY
pero ahora hay dos valores de bar
para elegir. ¿Qué resultado esperarías, A
o B
? ¿O debería la base de datos devolver más de una fila, violando el contrato de GROUP BY
?
Debe hacer lo siguiente:
SELECT cr.review_sk,
cr.cs_sk,
cr.full_name,
tolist(to_char(cf.fact_date, ''mm/dd/yyyy'')) "appt",
cs.cs_id,
cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like ''%'' || UPPER(i_cs_id) || ''%''
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;
El grupo por se usa para agregar algunos datos, dependiendo de la función de agregado, y aparte de eso, debe colocar la columna o columnas a las que necesita la agrupación.
por ejemplo:
select d.deptno, max(e.sal) from emp e, dept d where e.deptno = d.deptno group by d.deptno;
Esto dará como resultado el salario máximo de los departamentos.
Ahora si omitimos la cláusula d.deptno de group by, dará el mismo error.
El mismo error también aparece cuando la palabra clave UPPER o LOWER no se usa en ambos lugares en la expresión de selección y grupo por expresión.
Incorrecto :-
select a , count(*) from my_table group by UPPER(a) .
Correcto :-
select UPPER(a) , count(*) from my_table group by UPPER(a) .
Incluya en la cláusula GROUP BY
todas las expresiones SELECT
que no sean argumentos de función de grupo.
Lástima que Oracle tenga limitaciones como estas. Claro, el resultado para una columna que no está en GROUP BY sería aleatorio, pero a veces lo desea. Silly Oracle, puedes hacer esto en MySQL / MSSQL.
PERO hay un trabajo para Oracle:
Si bien la siguiente línea no funciona
SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;
Puede engañar a Oracle con algunos 0 como los siguientes, para mantener su columna en el alcance, pero no agruparla (suponiendo que estos sean números, de lo contrario use CONCAT)
SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A);
Si busca a tientas en virtud de incluir la cláusula GROUP BY
, cualquier expresión en SELECT
, que no sea función de grupo (o función agregada o columna agregada) como COUNT
, AVG
, MIN
, MAX
, SUM
y así sucesivamente ( Lista de funciones de agregación ) debe estar presente en la cláusula GROUP BY
.
Ejemplo (forma correcta) (aquí employee_id
no es función de grupo (columna no agregada), por lo que debe aparecer en GROUP BY
. Por el contrario, sum (salario) es una función de grupo (columna agregada), por lo que no es necesario que aparezca en la cláusula GROUP BY
.
SELECT employee_id, sum(salary)
FROM employees
GROUP BY employee_id;
Ejemplo (forma incorrecta) (aquí employee_id
no es función de grupo y no aparece en la cláusula GROUP BY
, lo que dará lugar al error ORA-00979.
SELECT employee_id, sum(salary)
FROM employees;
Para corregirlo, necesita hacer una de las siguientes cosas:
- Incluye todas las expresiones no agregadas enumeradas en la cláusula
SELECT
en la cláusulaGROUP BY
- Elimine la función de grupo (agregado) de la cláusula
SELECT
.