Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: John_Salchichon en 13 Junio 2011, 20:55 pm



Título: AYUDA CON OTRA CONSULTITA SQL
Publicado por: John_Salchichon en 13 Junio 2011, 20:55 pm
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:

Código:
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 :(


Título: Re: AYUDA CON OTRA CONSULTITA SQL
Publicado por: Nakp en 14 Junio 2011, 08:25 am
por que estas agrupando si simplemente estas sacando un promedio?


Título: Re: AYUDA CON OTRA CONSULTITA SQL
Publicado por: KuraraGNU en 14 Junio 2011, 14:31 pm
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
                   


Título: Re: AYUDA CON OTRA CONSULTITA SQL
Publicado por: 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

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


Título: Re: AYUDA CON OTRA CONSULTITA SQL
Publicado por: KuraraGNU en 16 Junio 2011, 13:44 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/NumeroDeDatos
Por 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.

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.