TABLAS:
Ciudades(nomCiu, habCiu, alcCiu)
Plantas(codPlan, nomPlan, dirPlan, tipoPlan, nomCiu)
Sectores(numSec, codPlan, dscSec, nivelSec, cntPerSec)
Generadores(codGen, dscGen, kwGen, fchInst, cicGen, cicUtilizGen, numSec, codPlan)
CONSULTA:
Mostrar los datos de las ciudades que tienen plantas que tienen sectores de nivel 3 y que no tienen generadores con capacidad de generación mayor al promedio de generación de todos los generadores de todas las plantas de la empresa.
Lo que hice:
SELECT C.ALCCIU, C.HABCIU, C.NOMCIU
FROM CIUDADES C, PLANTAS P, SECTORES S, GENERADORES G
WHERE C.NOMCIU = P.NOMCIU
AND S.CODPLAN = G.CODPLAN
AND S.NUMSEC = G.NUMSEC
AND S.NIVELSEC = 3
GROUP BY C.ALCCIU, C.HABCIU, C.NOMCIU
HAVING G.KWGEN >= (SELECT AVG(G.KWGEN)
FROM GENERADORES G
GROUP BY G.KWGEN);
Error:
Error en la línea de comandos:8 Columna:13
Informe de error:
Error SQL: ORA-00979: no es una expresión GROUP BY
00979. 00000 - "not a GROUP BY expression"
*Cause:
*Action:
Alguna idea? es la ultima que me queda :(
por que estas agrupando si simplemente estas sacando un promedio?
Quizas porque estas agrupando por C.ALCCIU, C.HABCIU, C.NOMCIU y ahi no existe el campo G.KWGEN, tendrias que incluirlo CREO, porque el error te da en esa linea, en la linea 8.
Pero creo que con un inner join y con poner lo que has puesto en el having en el where lo tienes mas facil.
SELECT ALCCIU, HABCIU, NOMCIU
FROM CIUDADES C INNER JOIN PLANTAS P ON C.NOMCIU = P.NOMCIU
INNER JOIN SECTORES S ON CODPLAN=S.CODPLAN
INNER JOIN GENERADORES G ON NUMSEC=S.NUMSEC
WHERE NIVELSEC = 3
AND KWGEN >= (SELECT AVG(G.KWGEN)
FROM GENERADORES G
GROUP BY G.KWGEN);
Mira a ver si eso esta bien e.e
Nakp: porque en oracle no se porque razon, si utilizas la funcion AVG debes agrupar obligatoriamente... no me preguntes porque
KuraraGNU:
no entiendo mucho el INNER JOIN pero la verdad q si.. no se para q use el HAVING si con un AND creo se puede...
no entiendo mucho lo del inner join, ademas me tira un error.. pero siguiendo tu idea lo q hice fue:
SELECT c.ALCCIU, c.HABCIU, c.NOMCIU
FROM CIUDADES C, PLANTAS P, SECTORES S, GENERADORES G
WHERE C.NOMCIU = P.NOMCIU
AND S.CODPLAN = G.CODPLAN
AND S.NUMSEC = G.NUMSEC
AND S.NIVELSEC = 3
AND KWGEN >= (SELECT AVG(G.KWGEN)
FROM GENERADORES G
GROUP BY G.KWGEN);
ahora no me tira mas error pero nunca me devuelve nada tampoco, chequeare a ver si es por los datos de prueba xD
Cita de: John_Salchichon en 14 Junio 2011, 21:01 PM
Nakp: porque en oracle no se porque razon, si utilizas la funcion AVG debes agrupar obligatoriamente... no me preguntes porque
Yo te lo explico si quieres, tienes que agrupar, porque tienes que decirle un rango en el cual hacer la media. La formula de la media es:
sumaDeDatos/NumeroDeDatosPor ello al agrupar, le das a la funcion el parametro: NumeroDeDatos. Porque aunque tu lo veas muy claro en plan: pues su es la media de la columna A, pues nada mas que la pongo y ya esta, pues no, porque el programa lo que hace es recorrerlo campo a campo y no los cuenta, solo los muestra, a menos que le hagas un group by.
Quizas no me he explicado del todo bien, no estudie muy a fondo a programacion, soy del ciclo de sistemas y lo de la tabla de indices por ejemplo, no tengo ni idea, aunque insisti en que me lo enseniasen.
Cita de: John_Salchichon en 14 Junio 2011, 21:01 PM
KuraraGNU:
no entiendo mucho el INNER JOIN pero la verdad q si.. no se para q use el HAVING si con un AND creo se puede...
no entiendo mucho lo del inner join, ademas me tira un error.. pero siguiendo tu idea lo q hice fue:
SELECT c.ALCCIU, c.HABCIU, c.NOMCIU
FROM CIUDADES C, PLANTAS P, SECTORES S, GENERADORES G
WHERE C.NOMCIU = P.NOMCIU
AND S.CODPLAN = G.CODPLAN
AND S.NUMSEC = G.NUMSEC
AND S.NIVELSEC = 3
AND KWGEN >= (SELECT AVG(G.KWGEN)
FROM GENERADORES G
GROUP BY G.KWGEN);
ahora no me tira mas error pero nunca me devuelve nada tampoco, chequeare a ver si es por los datos de prueba xD
Algo haria mal, yo es que me leo los errores y miro donde me he podido confundir.