Ver Mensaje Individual
  #5 (permalink)  
Antiguo 26/04/2015, 15:35
verdeazultrans
 
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?