Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

[SOLUCIONADO] Duda elemental de Group By.

Estas en el tema de Duda elemental de Group By. en el foro de Oracle en Foros del Web. Hola a todos, a ver si me pueden ayudar. Tengo este enunciado --Muestra el nombre de los empleados cuyo salario --es el salario más bajo ...
  #1 (permalink)  
Antiguo 26/04/2015, 13:00
 
Fecha de Ingreso: diciembre-2014
Mensajes: 17
Antigüedad: 10 años
Puntos: 0
Duda elemental de Group By.

Hola a todos, a ver si me pueden ayudar. Tengo este enunciado

--Muestra el nombre de los empleados cuyo salario
--es el salario más bajo en el departamento donde trabaja.


Código SQL:
Ver original
  1. SELECT department_id, first_name MIN (salary)
  2. FROM employee
  3. GROUP BY department_id, first_name

Y a mi parecer debe salir correctamente, el problema es que aparecen un montón de filas de nombres con el mismo departamento, se repiten.

Otro enunciado parecido con una solución parecida



--Muestra de cada departamento, su código, nombre, localidad
--y nombre del empleado más antiguo en ese departamento.


Código SQL:
Ver original
  1. SELECT d.department_id, d.name, d.location_id, e.last_name, MIN
  2. (e.hire_date)
  3. FROM department d, employee e
  4. WHERE d.department_id=e.department_id
  5. GROUP BY d.department_id, d.name, d.location_id, e.last_name;

Aquí pasa lo mismo que en el anterior, se repiten las filas y supuestamente solo debería haber una por departamento.

Última edición por gnzsoloyo; 26/04/2015 a las 14:36
  #2 (permalink)  
Antiguo 26/04/2015, 13:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda elemental de Group By.

Los resultados no son incorrectos, sino que tus soluciones están incompletas.
Esas queries requieren subconsultas que no estas haciendo.
No te las escribiremos, pero si te diremos que tienes que analizar mejo el enunciado para entender qué pide, porque sólo estas viendo una parte de cada planteo.

Por cierto, ¿con que DBMS estas estudiando?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 26/04/2015, 14:20
 
Fecha de Ingreso: diciembre-2014
Mensajes: 17
Antigüedad: 10 años
Puntos: 0
Respuesta: Duda elemental de Group By.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Los resultados no son incorrectos, sino que tus soluciones están incompletas.
Esas queries requieren subconsultas que no estas haciendo.
No te las escribiremos, pero si te diremos que tienes que analizar mejo el enunciado para entender qué pide, porque sólo estas viendo una parte de cada planteo.

Por cierto, ¿con que DBMS estas estudiando?

Lo he subido a este foro porque llevo horas pensando y nada. Sobre lo que dices lo único que se me ocurre es calcular el mínimo salario en una subconsulta pero eso sería cambiar lo que ya tengo (que dices que ya está bien) y no lo veo sentido alguno

Código SQL:
Ver original
  1. SELECT department_id, first_name, salary
  2. FROM employee
  3. GROUP BY department_id, first_name
  4. HAVING (depatment_id, first_name, salary) IN (SELECT department_id, first_name,
  5. MIN(salary) GROUP BY department_id, first_name FROM employee)


Estoy trabajando con scott, de la 9 versión de oracle. No creo que el problema venga de ahí.

Última edición por gnzsoloyo; 26/04/2015 a las 14:36
  #4 (permalink)  
Antiguo 26/04/2015, 14:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda elemental de Group By.

Nadie ha dicho que hay aun problema con lo que estés trabajando. La pregunta es porque suele suceder que una misma query en dos DBMS se puede escribir de formas diferentes, de acuerdo a las particularidades de cada uno.
El problema que te enfrentas es, en realidad, de entendimientos de las consultas.
La primera que te piden dice esto:
Cita:
--Muestra el nombre de los empleados cuyo salario
--es el salario más bajo en el departamento donde trabaja.
Esto significa que necesitas los nombres de los empleados con menor salario por cada departamento. Pero no te pide qué salario, y esencialmente tampoco el departamento, pero esto ultimo está implícito.
Lo primero que debes saber es cuál es el salario más bajo por departamento:
Código SQL:
Ver original
  1. SELECT department_id, MIN (salary) Salary
  2. FROM employee
  3. GROUP BY department_id, first_name;
En este contexto debes verificar sobre dos datos y no uno, por lo que mi idea sería:
Código SQL:
Ver original
  1. SELECT department_id, first_name
  2. FROM employee
  3. WHERE (department_id, salary) IN (SELECT department_id, MIN (salary) Salary
  4. FROM employee
  5. GROUP BY department_id, first_name);
Esto te puede devolver varias veces el mismo departamento, de acuerdo a cuantos empelados haya con ese mismo sueldo...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/04/2015, 15:35
 
Fecha de Ingreso: diciembre-2014
Mensajes: 17
Antigüedad: 10 años
Puntos: 0
Respuesta: Duda elemental de Group By.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Nadie ha dicho que hay aun problema con lo que estés trabajando. La pregunta es porque suele suceder que una misma query en dos DBMS se puede escribir de formas diferentes, de acuerdo a las particularidades de cada uno.
El problema que te enfrentas es, en realidad, de entendimientos de las consultas.
La primera que te piden dice esto:

Esto significa que necesitas los nombres de los empleados con menor salario por cada departamento. Pero no te pide qué salario, y esencialmente tampoco el departamento, pero esto ultimo está implícito.
Lo primero que debes saber es cuál es el salario más bajo por departamento:
Código SQL:
Ver original
  1. SELECT department_id, MIN (salary) Salary
  2. FROM employee
  3. GROUP BY department_id, first_name;
En este contexto debes verificar sobre dos datos y no uno, por lo que mi idea sería:
Código SQL:
Ver original
  1. SELECT department_id, first_name
  2. FROM employee
  3. WHERE (department_id, salary) IN (SELECT department_id, MIN (salary) Salary
  4. FROM employee
  5. GROUP BY department_id, first_name);
Esto te puede devolver varias veces el mismo departamento, de acuerdo a cuantos empelados haya con ese mismo sueldo...

Gracias por tu ayuda pero esa consulta sigue sin funcionar, aparece las mismas filas (32) que en mi consulta original a pesar de que existen 10 departamentos, y he podido comprobar que no aparecen tantos porque tengan el mismo salario.

Creo que he encontrado una solución. que ahora que me fijo es muy parecida a la tuya, pero sigue sin satisfacerme del todo, quizás porque sea demasiado cabezón. Lo que he hecho ha sido utilizar la única consulta que funciona

Código SQL:
Ver original
  1. SELECT department_id, MIN (salary) Salary
  2. FROM employee
  3. GROUP BY department_id

Y meterla dentro de una subconsulta, haciendo que me muestre el nombre que tenga un salario que coincida con la consulta que acabo de poner. Esta es la solución que he encontrado:

Código SQL:
Ver original
  1. SELECT first_name, department_id, salary
  2. FROM employee
  3. WHERE (department_id, salary) IN
  4. (SELECT department_id, MIN (salary) Salary
  5. FROM employee
  6. GROUP BY department_id)


La diferencia entre esta y todas las anteriores es que la agrupación se hace por una columna y la columna de la función, no por tres columnas. Lo que me extraña, ¿es qué no se puede agrupar por varias columnas y una función?
  #6 (permalink)  
Antiguo 26/04/2015, 16:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda elemental de Group By.

No se puede aplicar agrupamientos sobre columnas afectadas por funciones de agregado. Eso es básico, aparece en todos los manuales.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 26/04/2015, 17:09
 
Fecha de Ingreso: diciembre-2014
Mensajes: 17
Antigüedad: 10 años
Puntos: 0
Respuesta: Duda elemental de Group By.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No se puede aplicar agrupamientos sobre columnas afectadas por funciones de agregado. Eso es básico, aparece en todos los manuales.
No te entiendo
  #8 (permalink)  
Antiguo 27/04/2015, 06:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda elemental de Group By.

Cita:
Iniciado por verdeazultrans Ver Mensaje
No te entiendo
En tu último post dijiste esto:
Cita:
La diferencia entre esta y todas las anteriores es que la agrupación se hace por una columna y la columna de la función, no por tres columnas.
COn eso se entiende que la columna donde se aplcia la funcion agrupada (MIN()), está dentro de las columnas del GROUP BY, cosa prohibida en todos los DBMS.

Si eso no es así, trata de describirlo mejor para evitar confusiones.
Tu agrupamiento no es con la columna de la función, sino que estás agrupando por department_id, first_name.

Vamos a ver si se entiende: Esa forma de agrupar te funcionaría en MySQL, pero no en Oracle, porque Oracle no admite que un GROUP BY contenga columnas que no aparezcan en el SELECT, con la sola excelcion de las afectadas por las clausulas agrupadas.
¿Se entiende?
Entonces, para poner el first_name necesitarías ponerla en el SELECT, pero si haces eso te listará todos los empleados con su salario, ya que el agrupamiento tomaría las dos columnas, y no sólo el departamento.
¿Se entiende?
Bien, el problema que tienes es que listar el salario minimo de un departameno es fácil:
Código SQL:
Ver original
  1. SELECT department_id, MIN (salary) Salary
  2. FROM employee
  3. GROUP BY department_id;
Pero listar los nombres de aquellos que lo cobren, no. Porque deberías obtenerlo de otra consulta incompatible. Por eso mi propuiesta de esto:
Código SQL:
Ver original
  1. SELECT department_id, first_name, salary
  2. FROM employee
  3. WHERE (department_id, salary)
  4.     IN (SELECT department_id, MIN (salary) Salary
  5.     FROM employee
  6.     GROUP BY department_id, first_name);

Ahora bien, tu me dices que esto:
Cita:
Gracias por tu ayuda pero esa consulta sigue sin funcionar, aparece las mismas filas (32) que en mi consulta original a pesar de que existen 10 departamentos, y he podido comprobar que no aparecen tantos porque tengan el mismo salario.
lo cual me resulta súmamente extraño
En primer lugar, postea la consulta como la copiaste tu, ya que no puedo estar seguro de que hayas hecho lo correcto. Más de una vez han copiado mal las cosas.
En segundo lugar, postea el resultado que te devuelve la query. También nos ha pasado que no esté correctamente interpretado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 27/04/2015, 06:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda elemental de Group By.

Cita:
Iniciado por verdeazultrans Ver Mensaje
Gracias por tu ayuda pero esa consulta sigue sin funcionar, aparece las mismas filas (32) que en mi consulta original a pesar de que existen 10 departamentos, y he podido comprobar que no aparecen tantos porque tengan el mismo salario.

Creo que he encontrado una solución. que ahora que me fijo es muy parecida a la tuya, pero sigue sin satisfacerme del todo, quizás porque sea demasiado cabezón. Lo que he hecho ha sido utilizar la única consulta que funciona

Código SQL:
Ver original
  1. SELECT department_id, MIN (salary) Salary
  2. FROM employee
  3. GROUP BY department_id

Y meterla dentro de una subconsulta, haciendo que me muestre el nombre que tenga un salario que coincida con la consulta que acabo de poner. Esta es la solución que he encontrado:

Código SQL:
Ver original
  1. SELECT first_name, department_id, salary
  2. FROM employee
  3. WHERE (department_id, salary) IN
  4. (SELECT department_id, MIN (salary) Salary
  5. FROM employee
  6. GROUP BY department_id)


La diferencia entre esta y todas las anteriores es que la agrupación se hace por una columna y la columna de la función, no por tres columnas. Lo que me extraña, ¿es qué no se puede agrupar por varias columnas y una función?
Por cierto, me acabo de dar cuenta de una cosa...
¿Te das cuenta que la consulta que pones al final de este post es exactamente la misma que yo te propuse? No parecida, es LA MISMA.

¿Por qué dices enctonces que no te funcionó?

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 27/04/2015, 13:26
 
Fecha de Ingreso: diciembre-2014
Mensajes: 17
Antigüedad: 10 años
Puntos: 0
Respuesta: Duda elemental de Group By.

Ya lo entiendo todo. La clave es esto:

Cita:
Entonces, para poner el first_name necesitarías ponerla en el SELECT, pero si haces eso te listará todos los empleados con su salario, ya que el agrupamiento tomaría las dos columnas, y no sólo el departamento.
Sabía que no se podía incluir funciones en group by, con lo que dije antes me refería a que se incluían dentro de la operación del agrupamiento, pero de eso no tenía ni idea. Cuando leí tu consulta pensé que el group by pertenecía a la consulta y no a la subconsulta, probablemente el error viniera de ahí.

Muchas gracias, solucionado y entendido.

Etiquetas: bases-de-datos-general, elemental, group, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:52.