1. Faro

Nivel 2 · Verifica y resume plantilla y salarios en SQL

La solicitud

De Laura Bennett, Directora de Finanzas

“Acordamos el plan: plantilla, nómina y salario típico por departamento, y luego reportes directos por gerente. La exportación de RR. HH. se ha editado a mano durante años, así que primero dime si cuadra: alguien listado dos veces, gerentes que no están en la lista, salarios que parecen erróneos.”

Tu objetivo

Paso 1 de 3. Verifica la tabla. Une employees (alias e) consigo misma (alias m) con un LEFT JOIN sobre m.employee_id = e.manager_id y devuelve una fila: employees (filas), distinct_ids, distinct_names (first_name || ' ' || last_name distintos), no_manager (e.manager_id es NULL), unknown_manager (e.manager_id no es NULL pero no se encontró fila de gerente), min_salary y max_salary.

  • Lee de la tabla employeespendiente
  • Muestra exactamente employees distinct_ids distinct_names no_manager unknown_manager min_salary max_salarypendiente
  • 1 fila, ordenadas como se pidependiente

Paso 1 · tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de employees · presiona Ejecutar para ver el tuyo
    Vista previa de employees
    employee_idfirst_namelast_namedepartmenttitle
    1CatherineHaleExecutiveChief Executive Officer
    2RobertKimExecutiveChief Operating Officer
    3MeganCollinsSalesHead of Sales
    4ChloeGutierrezSalesAccount Executive

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    Paso 2 · tu consulta

    SQL

    Cargando el editor…

      ResultadoVista previa de employees · presiona Ejecutar para ver el tuyo
      Vista previa de employees
      employee_idfirst_namelast_namedepartmenttitle
      1CatherineHaleExecutiveChief Executive Officer
      2RobertKimExecutiveChief Operating Officer
      3MeganCollinsSalesHead of Sales
      4ChloeGutierrezSalesAccount Executive

      Mote revisa tu resultado

      Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

      Paso 3 · tu consulta

      SQL

      Cargando el editor…

        ResultadoVista previa de employees · presiona Ejecutar para ver el tuyo
        Vista previa de employees
        employee_idfirst_namelast_namedepartmenttitle
        1CatherineHaleExecutiveChief Executive Officer
        2RobertKimExecutiveChief Operating Officer
        3MeganCollinsSalesHead of Sales
        4ChloeGutierrezSalesAccount Executive

        Mote revisa tu resultado

        Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

        Tablas

        Datos de la tienda Harbor & Pine, listos para consultar.

        employees60 filas · 8 columnas
        • employee_idinteger
        • first_namevarchar
        • last_namevarchar
        • departmentvarchar
        • titlevarchar
        • manager_idinteger
        • hire_datedate
        • salaryinteger
        Primeras 5 filas de employees
        employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
        1CatherineHaleExecutiveChief Executive OfficerNULL2016-03-01285000
        2RobertKimExecutiveChief Operating Officer12017-01-09235000
        3MeganCollinsSalesHead of Sales12018-04-16172000
        4ChloeGutierrezSalesAccount Executive32020-01-2172000
        5FrankBellSalesAccount Executive32023-05-2173000
        customers2,018 filas · 9 columnas
        • customer_idinteger
        • first_namevarchar
        • last_namevarchar
        • emailvarchar
        • cityvarchar
        • statevarchar
        • signup_datedate
        • segmentvarchar
        • referral_sourcevarchar
        Primeras 5 filas de customers
        customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
        1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
        2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNULL
        3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNULL
        4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
        5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNULL
        products120 filas · 8 columnas
        • product_idinteger
        • namevarchar
        • categoryvarchar
        • subcategoryvarchar
        • unit_pricedecimal
        • unit_costdecimal
        • launched_ondate
        • is_activeboolean
        Primeras 5 filas de products
        product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
        101Vale Velvet LoveseatFurnitureSofas1659.00NULL2023-09-11true
        102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
        103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
        104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
        105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
        orders12,000 filas · 7 columnas
        • order_idinteger
        • customer_idinteger
        • order_datetimestamp
        • statusvarchar
        • channelvarchar
        • shipping_feedecimal
        • coupon_codevarchar
        Primeras 5 filas de orders
        order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
        10011252023-01-01 20:51:19completedweb0.00NULL
        10021562023-01-02 07:58:46completedweb0.00NULL
        1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
        1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
        1005822023-01-02 11:43:36completedweb0.00WELCOME10
        order_items30,338 filas · 6 columnas
        • order_item_idinteger
        • order_idinteger
        • product_idinteger
        • quantityinteger
        • unit_pricedecimal
        • discount_pctdecimal
        Primeras 5 filas de order_items
        order_item_idorder_idproduct_idquantityunit_pricediscount_pct
        11001121931.990.00
        21001154311.990.00
        31002154411.990.00
        410021941149.000.00
        51002193219.990.00
        returns1,673 filas · 5 columnas
        • return_idinteger
        • order_item_idinteger
        • returned_ondate
        • reasonvarchar
        • refund_amountdecimal
        Primeras 5 filas de returns
        return_idorder_item_idreturned_onreasonrefund_amount
        1142023-01-10damaged83.69
        2422023-01-10wrong_item19.99
        31052023-01-14wrong_item10.99
        4242023-01-16changed_mind26.99
        51262023-01-16late20.99
        web_sessions40,000 filas · 7 columnas
        • session_idinteger
        • customer_idinteger
        • started_attimestamp
        • devicevarchar
        • sourcevarchar
        • pages_viewedinteger
        • convertedboolean
        Primeras 5 filas de web_sessions
        session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
        1NULL2023-01-01 23:02:24mobilepaid1false
        2182023-01-01 15:07:49desktoppaid1false
        3NULL2023-01-01 16:55:46desktopdirect7false
        4NULL2023-01-01 12:43:28mobileorganic3false
        5NULL2023-01-01 13:06:21mobilesocial2false
        marketing_spend3,276 filas · 3 columnas
        • spend_datedate
        • channelvarchar
        • amountdecimal
        Primeras 5 filas de marketing_spend
        spend_datechannelamount
        2023-01-01paid492.99
        2023-01-01email37.38
        2023-01-01social200.53
        2023-01-02paid709.13
        2023-01-02email64.13

        La lección

        Qué estás verificando y por qué

        Una exportación de RR. HH. se ve ordenada, pero a menudo se edita a mano: se vuelve a ingresar a las personas tras un cambio de puesto, los gerentes se van y sus reportes siguen apuntando a ellos. Antes de sumar nada, comprueba tres cosas.

        • ¿Alguien está listado dos veces? Los ids son únicos por diseño, así que compara el número de filas también con el conteo de nombres distintos.
        • ¿Cada línea de reporte lleva a algún sitio? Un manager_id que no coincide con ningún employee_id es un huérfano. Solo el CEO debe carecer de gerente.
        • ¿Son plausibles los salarios? MIN y MAX detectan una cifra mensual escrita como anual, o un cero faltante.

        La verificación de reportes necesita un autojoin: la tabla unida consigo misma bajo dos alias, uno para el empleado y otro para el gerente. Un LEFT JOIN conserva a todos los empleados aunque no se encuentre fila de gerente, y entonces las columnas de ese gerente son NULL:

        FROM employees AS e
        LEFT JOIN employees AS m ON m.employee_id = e.manager_id

        Un empleado con manager_id pero con NULL en m.employee_id es un huérfano. Aquí no hay ninguno.

        Plantilla, nómina, media y mediana

        El paso 2 es un GROUP BY department simple con varios agregados lado a lado. El par interesante es media y mediana. La media suma todos los salarios y divide; la mediana es el salario del medio cuando están ordenados. En un departamento de siete donde una persona es el responsable, el salario del responsable mueve mucho la media y apenas la mediana:

        department headcount mean_salary median_salary
        Engineering 8 149,750 139,500
        Data & Analytics 7 108,000 92,000
        Sales 9 84,000 73,000
        Customer Support 9 59,333 50,000

        Para “cuánto gana aquí una persona típica”, informa de la mediana. La nómina sigue siendo la suma: eso es lo que paga el presupuesto.

        Tramo de control

        El tramo de control es el número de personas que reportan directamente a un gerente. Es un insumo habitual del diseño organizativo: demasiado estrecho y la empresa es pesada en la cúpula, demasiado amplio y los gerentes no pueden con todo. Con el autojoin interno, cada fila es una línea de reporte, así que contar filas por gerente da el tramo. Agrupa por las columnas del gerente, de m.

        Los tramos aquí van de 2 (Anna Chen, Sales Manager) a 7. Los dos gerentes de Support tienen 5 y 3.

        Trampas

        • Un join interno en la verificación oculta justo las filas que buscas; usa LEFT JOIN.
        • GROUP BY m.first_name || ' ' || m.last_name fusionaría a dos gerentes que comparten nombre; agrupar por id es más seguro en una empresa grande.
        • Las medias departamentales de 2 o 5 personas pueden revelar salarios individuales. Mantenlas fuera de los informes que salgan de Finanzas y RR. HH.

        Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.