Volver a la lista de artículos Artículos
Lectura de 7 minutos

¿Quién tiene el salario más alto, según el departamento? ¡Utiliza SQL para averiguarlo!

Este artículo muestra cómoobtener el salario total por departamento de una organización, utilizando la funcionalidad GROUP BY de SQL. Explicamos la cláusula SQL GROUP BYen detalle junto con el filtrado condicional utilizando una cláusula HAVING.

Comprender el gasto salarial de una organización es uno de los puntos de partida más comunes para los líderes empresariales. Les ayuda a ver quién en la organización tiene el mayor coste salarial total, por departamentos. También es posible que quieran ver la distribución de los pagos salariales para tener una mejor idea de la asignación de costes.

En este artículo, voy a ilustrar cómo se puede utilizar el SQL GROUP BY para lograr esto. Si eres un profesional que puede utilizar este tipo de análisis, o si eres un estudiante que intenta comprender la funcionalidad de SQL GROUP BY a través de un caso de uso práctico, ¡sigue leyendo!

Antes de resolver el problema, echemos un vistazo al conjunto de datos que utilizaremos.

El conjunto de datos de muestra

employees:

employeenumberlastnamelevelannual_salarydepartment
1056Patterson1010000Finance
1076Firrel57000Marketing
1088Patterson1012500Finance
1102Bondur25000Human Resources
1143Bow25000Sales
1165Jennings25000Sales
1166Thompson1010000Marketing

Arriba está la tabla employees con cinco columnas, con nombres de columna autoexplicativos.

  • employeenumber: Identificador único del empleado.
  • lastname: El apellido del empleado.
  • level: El nivel del empleado en la jerarquía.
  • annual_salary: La remuneración anual del empleado.
  • department: El departamento del empleado.

Ahora, digamos que quiere encontrar el salario anual total dado a los empleados que pertenecen a diferentes departamentos, como finanzas, marketing, recursos humanos y ventas. Este tipo de operación de datos se conoce como agregación.

¿Qué es la agregación?

Dado que es difícil analizar cada fila por separado, especialmente cuando se trata de conjuntos de datos grandes, a menudo resulta útil agrupar datos similares para comprender algunas estadísticas de cada uno de esos grupos. Esto se conoce como agregación.

Es posible que desee agrupar varios segmentos de clientes (agregación por segmento de clientes), calcular el tamaño medio de los pedidos, calcular las ventas totales por región (agregación por geografía) o comprobar el número total de artículos de varios vendedores en un sitio web (agregación por vendedor). Todos estos son ejemplos de agregación de datos que pueden ayudar a analizar los datos y a generar información.

Así, en este caso, queremos agregar los empleados por departamento y, a continuación, calcular el salario total (es decir, la suma de los salarios) de todos los empleados que pertenecen a ese departamento.

Puede pensar que puede hacerlo fácilmente para la tabla anterior sumando los salarios a mano. Pero seguramente necesitará una forma más rápida si tiene miles de empleados. Aquí es donde la cláusula SQL GROUP BY puede ayudarle.

La cláusula SQL GROUP BY

La cláusula SQL GROUP BY le ayuda a agregar los datos en grupos y luego calcular las estadísticas relacionadas con ese grupo.

En nuestro caso, puede utilizar la siguiente consulta para calcular el salario total por departamento. Los comentarios explican brevemente la función de cada construcción en la consulta.

Consulta:

SELECT department,                        -- column to be returned
SUM(annual_salary)                        -- aggregate function
FROM employees                            -- table name
GROUP BY department;                      -- column to use for grouping

Salida:

departmentSUM(annual_salary)
Finance22500
Marketing17000
Sales10000
Human Resources5000

Para ayudarte a entenderlo mejor, déjame profundizar un poco más en la estructura de esta consulta y explicar cada cláusula o palabra clave utilizada.

Ejemplo de estructura de una consulta con una cláusula GROUP BY

Si tuviera que dibujar un esqueleto o estructura de muestra de una consulta SQL que utiliza una cláusula GROUP BY, se vería algo así. Puede que no uses todas las construcciones todo el tiempo, pero es útil entenderlas.

Ejemplo de estructura:

SELECT <columns>, <aggregate function>
FROM <table name>
WHERE <conditions>
GROUP BY <columns>
HAVING <aggregate condition>
ORDER BY <columns>

En nuestra consulta para encontrar el salario total por departamento, hemos utilizado sólo las cláusulas SELECT, FROM, y GROUP BY.

Veamos cómo puede utilizar cada una de estas construcciones.

Columnas SELECT y función agregada

En esta parte de la consulta, se especifican las columnas que se van a agregar y devolver. Así, para el salario total por departamento, el departamento es una de las columnas a devolver.

Aquí también se elige la función de agregación. La función de agregación es la métrica o estadística que desea calcular para la columna agrupada. En nuestro caso, SUM() es la función agregada. SQL también proporciona otras funciones de agregación incorporadas muy útiles. Echa un vistazo a esta tabla para ver varias funciones agregadas y un caso de uso de ejemplo para cada una.

Aggregate FunctionExample Use Case
SUM()Find the total salary by department
COUNT()Find the number of employees in each department
MAX()Find the highest salary paid in each department
MIN()Find the lowest salary paid in each department
AVG()Find the average salary for each department

Para cambiar la estadística, todo lo que tiene que hacer es utilizar la función apropiada. Por ejemplo, si quiere calcular el salario medio, puede utilizar

Consulta:

SELECT department, AVG(annual_salary)
FROM employees
GROUP BY department;

Salida:

departmentAVG(annual_salary)
Finance11250
Marketing8500
Sales5000
Human Resources5000

También puede utilizar varias funciones de agregación juntas. Por ejemplo:

Consulta:

SELECT department, AVG(annual_salary), SUM(annual_salary)
FROM employees
GROUP BY department;

Salida:

departmentAVG(annual_salary)SUM(annual_salary)
Finance1125022500
Marketing850017000
Sales500010000
Human Resource50005000

FROM <tabla(s)> y WHERE <condiciones>

En esta sección, especifica la(s) tabla(s) de la(s) que desea obtener las columnas y cualquier condición que desee aplicar a las columnas seleccionadas.

Supongamos que quiere obtener los datos de sólo dos departamentos - marketing y ventas - de la tabla employees tabla.

Consulta:

SELECT department, SUM(annual_salary)
FROM employees
WHERE department in (‘Marketing’,’Sales’)
GROUP BY department;

Resultado:

departmentSUM(annual_salary)
Marketing17000
Sales10000

Listado de las columnas para agrupar con un GROUP BY

En esta parte de la consulta, se especifican las columnas que se quieren utilizar para agrupar los datos. Ya hemos visto la agrupación por departamento.

Una cosa a tener en cuenta aquí: si está usando múltiples columnas en su sentencia SELECT, necesita incluirlas todas aquí en la cláusula GROUP BY, excepto la(s) columna(s) que está(n) siendo usada(s) por la(s) función(es) agregada(s). Si no lo hace, probablemente obtendrá un error. Consulte este artículo para conocer los errores más comunes con GROUP BY y cómo evitarlos.

Así, por ejemplo, digamos que quiere SELECT y GROUP BY tanto el departamento como el nivel. La consulta se vería así

Consulta:

SELECT department, level, SUM(annual_salary)
FROM employees
WHERE department in (‘Marketing’,’Sales’)
GROUP BY department, level;

Salida:

departmentlevelSUM(annual_salary)
Marketing57000
Marketing1010000
Sales210000

Condiciones en la función agregada utilizando una cláusula HAVING

Puede elegir refinar y filtrar la salida de una consulta con una función agregada utilizando una cláusula HAVING. Una cláusula HAVING evalúa la(s) condición(es) en la salida de una función agregada y devuelve las filas que satisfacen ese criterio.

Así, si quiere encontrar todos los departamentos cuyo salario medio sea superior a 7000, puede utilizar la siguiente consulta.

Consulta:

SELECT department, SUM(annual_salary)
FROM employees
GROUP BY department
HAVING AVG(annual_salary)>7000;

Salida:

departmentSUM(annual_salary)
Finance22500
Marketing17000

Nota: No confunda la cláusula WHEREcon la cláusula HAVING. Mientras que una cláusula WHEREfiltra los registros de las tablas, una cláusula HAVINGfiltra los grupos.

Ordenar con una cláusula ORDER BY

Por último, puede ordenar los resultados utilizando una cláusula ORDER BY. Se puede utilizar para ordenar los resultados en orden ascendente o descendente.

Para ordenar los departamentos en orden alfabético, puede utilizar la siguiente consulta.

Consulta:

SELECT department, level, SUM(annual_salary)
FROM employees
WHERE department in (‘Marketing’,’Sales’,’Human Resources’)
GROUP BY department,level
ORDER BY department asc;  -- asc is used for ascending, desc for descending

Resultado:

departmentlevelSUM(annual_salary)
Human Resource25000
Marketing57000
Marketing1010000
Sales210000

Para más ejemplos y casos de uso de la cláusula GROUP BY, consulte este artículo.

¿Listo para escribir su consulta SQL GROUP BY?

Si has leído el artículo hasta aquí, estoy seguro de que estás listo para escribir tu consulta SQL GROUP BY para obtener el resultado deseado. He utilizado muchos ejemplos de consultas en este artículo para que te familiarices con el proceso de escribir consultas. Confía en mí - la práctica es la mejor manera de mejorar la escritura de consultas. Para practicar consultas como estas y otras, puedes consultar la pista Ejercicio de SQL de LearnSQL. Es una forma completa de perfeccionar tus habilidades.

SQL es una herramienta muy poderosa, no sólo para la agregación de datos, sino también para muchos otros casos de uso que requieren el crujido y la manipulación de datos. De hecho, es una habilidad imprescindible no sólo para los analistas de datos, sino para cualquier persona que aspire a trabajar en un entorno en el que se tomen decisiones basadas en datos.

Si eres nuevo en SQL y quieres aprender más sobre cómo escribir consultas SQL, te recomiendo encarecidamente el curso de LearnSQL para escribir consultas básicas. Te dará una base sólida para analizar los datos con SQL y aumentar tu carrera.

Entonces, ¿a qué esperas? ¡Empieza hoy mismo!