La solicitud

De Nicole Bennett, Socia de Negocio de RR. HH.
Tu objetivo
Une employees consigo misma (cada empleado con su gerente a través de manager_id). Devuelve una fila por empleado que tenga al menos un reporte directo, con: manager_name (el first_name del gerente, un espacio, last_name), title (el cargo del gerente), direct_reports (número de empleados cuyo manager_id es ese gerente) y avg_report_salary (salario promedio de esos reportes directos, redondeado a 0). Ordena por direct_reports descendente y luego por manager_name ascendente.
- Lee de la tabla
employeespendiente - Muestra exactamente
manager_nametitledirect_reportsavg_report_salarypendiente - 12 filas, ordenadas como se pidependiente
Tu consulta
Cargando el editor…
Solución de referencia
| employee_id | first_name | last_name | department | title |
|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer |
| 2 | Robert | Kim | Executive | Chief Operating Officer |
| 3 | Megan | Collins | Sales | Head of Sales |
| 4 | Chloe | Gutierrez | Sales | Account Executive |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Nicole, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NULL | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NULL |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NULL |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NULL |
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NULL | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NULL |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NULL |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NULL | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
Un self-join lee una tabla dos veces bajo dos alias. En employees, cada fila es una persona y
manager_id apunta a otra fila de la misma tabla. Darle dos nombres a la tabla te permite tratar una
copia como “el reporte” y la otra como “el gerente”.
Repaso: dos papeles, una tabla
SELECT e.first_name || ' ' || e.last_name AS employee_name,
e.department,
m.first_name || ' ' || m.last_name AS manager_name,
m.department AS manager_department
FROM employees AS e
JOIN employees AS m ON m.employee_id = e.manager_id
WHERE e.department <> m.department;
Esto lista a las personas cuyo gerente está en otro departamento: 8 filas, todas jefes de departamento que reportan
a Catherine Hale o Robert Kim en Executive. La dirección de la condición del join lleva el significado:
m.employee_id = e.manager_id se lee “m es el gerente de e”.
Para el ticket, el mismo join va seguido de un GROUP BY sobre el gerente. Tras el join hay una fila
por reporte, así que contar filas por gerente cuenta sus reportes directos. El inner join descarta a quien no tiene
reportes, que es exactamente la regla de “al menos un reporte directo”. Solo 12 de los 60 empleados gestionan a
alguien. Si RR. HH. también quisiera a las personas que no gestionan a nadie, con 0 reportes, empezarías desde la
copia del gerente y harías LEFT JOIN con los reportes.
Agrupa por m.employee_id además de las columnas de nombre. Dos gerentes podrían compartir un nombre; el id los mantiene
separados aunque solo muestres el nombre.
Errores comunes
- Condición invertida.
ON m.manager_id = e.employee_idhace demel reporte y deeel gerente. La consulta se ejecuta igual y devuelve equipos plausibles pero incorrectos. - Promediar el alias equivocado.
AVG(m.salary)es el salario del propio gerente repetido en cada fila. - Reportes directos frente a todos los reportes. Esto cuenta solo los reportes directos. Alguien que reporta a un líder de equipo que reporta a un jefe no cuenta para el jefe. Recorrer toda la cadena necesita una consulta recursiva, que aparece más adelante en la ruta.
En SQL Server
La concatenación de cadenas usa + o CONCAT: m.first_name + ' ' + m.last_name AS manager_name. CONCAT
también trata NULL como una cadena vacía, mientras que + devuelve NULL si cualquier parte es NULL. || existe solo en las
versiones más recientes (Azure SQL, SQL Server 2025), así que no cuentes con él.
¡Linterna encendida!
Practicaste: self joininner joingroup byaliases
- Resuelto
- Sin pistas
- Al primer intento
