1. Faro

Nivel 7 · Desafío final: el informe anual del estado de los clientes

La solicitud

De Catherine Hale, Directora Ejecutiva

“Para el paquete de la junta quiero el panorama de clientes de 2025 en una diapositiva: cuántos compradores de 2024 conservamos, cuántos perdimos, cuántos son totalmente nuevos o volvieron tras una pausa, y cuánto gastó cada grupo con nosotros en 2025.”

Tu objetivo

Paso 1 de 3. Devuelve una fila con: customers_2024 (número de compradores distintos de 2024), retained (compradores de 2024 que también son compradores de 2025), lapsed (compradores de 2024 que no son compradores de 2025) y retention_pct (retained / customers_2024 * 100, redondeado a 1).

  • Lee de la tabla orderspendiente
  • Muestra exactamente customers_2024 retained lapsed retention_pctpendiente
  • 1 filapendiente

Paso 1 · tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de orders · presiona Ejecutar para ver el tuyo
    Vista previa de orders
    order_idcustomer_idorder_datestatuschannel
    10011252023-01-01 20:51:19completedweb
    10021562023-01-02 07:58:46completedweb
    1003222023-01-02 10:25:27completedmarketplace
    1004482023-01-02 11:21:51completedmarketplace

    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 customers · presiona Ejecutar para ver el tuyo
      Vista previa de customers
      customer_idfirst_namelast_nameemailcity
      1OwenHudsonowen.hudson@icloud.comSan Francisco
      2DouglasMendozadmendoza69@gmail.comAtlanta
      3HenryBrookshbrooks@lakesidecafe.comLos Angeles
      4BrianGrahambgraham@bluecedarhomes.comSeattle

      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 customers · presiona Ejecutar para ver el tuyo
        Vista previa de customers
        customer_idfirst_namelast_nameemailcity
        1OwenHudsonowen.hudson@icloud.comSan Francisco
        2DouglasMendozadmendoza69@gmail.comAtlanta
        3HenryBrookshbrooks@lakesidecafe.comLos Angeles
        4BrianGrahambgraham@bluecedarhomes.comSeattle

        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.

        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
        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
        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
        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
        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
        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
        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

        Este desafío final convierte tres operaciones de conjuntos en el puente de clientes que usa toda revisión de crecimiento: de dónde vinieron los clientes de este año y adónde se fueron los del año pasado.

        Paso 1: retenidos y perdidos

        Dos listas de compradores, una por año, y dos comparaciones:

        • retained = compradores de 2024 INTERSECT compradores de 2025
        • lapsed = compradores de 2024 EXCEPT compradores de 2025

        Las CTE de compradores son una fila por pedido, así que cuenta DISTINCT customer_id cuando quieras el tamaño de una lista. Las operaciones de conjuntos ya devuelven ids distintos. En Harbor & Pine, 997 clientes compraron en 2024; 752 de ellos volvieron a comprar (75.4%) y 245 no. Retenidos más perdidos deben ser igual al total de 2024, una comprobación de sensatez gratis.

        Paso 2: cuatro estados, una tabla

        2025 tuvo 1,447 compradores. Dos de los grupos son fáciles, nuevos y retenidos. El tercero es el que la gente se pierde: clientes que compraron antes de 2024, se saltaron 2024 y volvieron en 2025. Llamarlos “nuevos” sobrestima la adquisición, así que reciben su propia etiqueta, reactivated:

        SELECT customer_id FROM (
          SELECT customer_id FROM buyers_2025
          INTERSECT
          SELECT customer_id FROM buyers_before_2025
        ) AS b
        EXCEPT
        SELECT customer_id FROM buyers_2024

        Envolver la primera operación en una subconsulta hace explícito el orden de las operaciones. (INTERSECT se asocia con más fuerza que UNION y EXCEPT en el SQL estándar, pero los paréntesis son más baratos que acordarse.)

        Los grupos no se solapan, así que UNION ALL con una etiqueta de estado los apila, y un GROUP BY cuenta cada uno: 752 retenidos, 635 nuevos, 245 perdidos, 60 reactivados. Nuevos + retenidos + reactivados = 1,447, cada comprador de 2025 exactamente una vez.

        Paso 3: cuánto gastó cada grupo

        Ahora une el resultado de una operación de conjuntos con datos reales. Agrega primero los ingresos de 2025 a una fila por cliente y luego únelos con las etiquetas. Los clientes retenidos aportan cerca de $1.49 millones a unos $1,987 cada uno, los clientes nuevos unos $758,000 a unos $1,193, y los 60 clientes reactivados unos $50,000. Los clientes perdidos no tienen ingresos en 2025, así que el inner join los descarta, que es lo que pide la tarea.

        Errores comunes

        • Contar pedidos en lugar de clientes en el paso 1 (el starter devuelve 3,673, el número de pedidos completados de 2024).
        • Juntar nuevos y reactivados, o dejar que un cliente caiga en dos grupos. Comprueba que los totales de los grupos sumen los conteos anuales de compradores.
        • Unir las etiquetas con order_items y contar filas, lo que convierte clientes en líneas de pedido.

        En SQL Server

        INTERSECT, EXCEPT y UNION ALL funcionan igual, y las tablas derivadas necesitan un alias como aquí. Las subconsultas escalares del paso 1 están bien en T-SQL, pero 100.0 * importa más allí: con dos conteos enteros, / truncaría el porcentaje a 0.

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