1. Faro

Nivel 7 · Desafío final: el informe de embudo para el presupuesto

La solicitud

De Jordan Reyes, Directora de Marketing

“La planificación del presupuesto es la semana que viene. Necesito tres tablas: cómo convierte cada fuente en cada dispositivo este año, cuánto ha costado por conversión cada canal de pago en los últimos tres años, y dónde pierde visitantes cada fuente. Asegúrate de que esta vez el gasto no se cuente doble.”

Tu objetivo

Paso 1 de 3. Para 2025, devuelve una fila por source y device con: source, device, sessions, conversions y conversion_rate_pct (conversions * 100 / sessions, redondeado a 2). Ordena por source y luego por device, ascendente.

  • Lee de la tabla web_sessionspendiente
  • Muestra exactamente source device sessions conversions conversion_rate_pctpendiente
  • 15 filas, ordenadas como se pidependiente

Paso 1 · tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de web_sessions · presiona Ejecutar para ver el tuyo
    Vista previa de web_sessions
    session_idcustomer_idstarted_atdevicesource
    1NULL2023-01-01 23:02:24mobilepaid
    2182023-01-01 15:07:49desktoppaid
    3NULL2023-01-01 16:55:46desktopdirect
    4NULL2023-01-01 12:43:28mobileorganic

    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 web_sessions · presiona Ejecutar para ver el tuyo
      Vista previa de web_sessions
      session_idcustomer_idstarted_atdevicesource
      1NULL2023-01-01 23:02:24mobilepaid
      2182023-01-01 15:07:49desktoppaid
      3NULL2023-01-01 16:55:46desktopdirect
      4NULL2023-01-01 12:43:28mobileorganic

      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 web_sessions · presiona Ejecutar para ver el tuyo
        Vista previa de web_sessions
        session_idcustomer_idstarted_atdevicesource
        1NULL2023-01-01 23:02:24mobilepaid
        2182023-01-01 15:07:49desktoppaid
        3NULL2023-01-01 16:55:46desktopdirect
        4NULL2023-01-01 12:43:28mobileorganic

        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.

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

        La lección

        Qué necesita el informe

        El paquete de presupuesto de Marketing tiene tres tablas, y cada una usa una técnica distinta de este capítulo:

        1. Conversión por fuente y dispositivo (2025): un GROUP BY con dos columnas.
        2. Costo por conversión por año y canal de pago: dos tablas, cada una agregada por su cuenta, y luego unidas.
        3. Embudo por fuente (2025): dos etapas por fuente con tasas por paso.

        Agrega antes de unir

        marketing_spend tiene una fila por día y canal. web_sessions tiene una fila por visita. Si las unes por canal y año, cada fila de gasto se repite una vez por cada sesión coincidente: el gasto de paid de 2025 pasa de $340,778 a $1.2 mil millones de la nada.

        La solución es llevar cada tabla a la granularidad de la respuesta antes, una fila por año y canal, en su propia CTE:

        WITH spend AS (SELECT year(spend_date) AS year, channel, SUM(amount) AS spend FROM marketing_spend GROUP BY 1, 2),
             conv  AS (SELECT year(started_at) AS year, source, COUNT(*) FILTER (WHERE converted) AS conversions FROM web_sessions GROUP BY 1, 2)

        Ahora el join es uno a uno y nada se cuenta dos veces. Organic y direct no tienen gasto, así que un inner join desde spend los descarta, que es lo que debe hacer una tabla de costos.

        Tasas por paso según la fuente

        Para la tabla de embudo, cuenta las sesiones con interacción y las conversiones por fuente en una sola pasada, y divide cada etapa entre la etapa anterior. engaged_pct muestra qué tan bien los visitantes de una fuente pasan de la página de aterrizaje; engaged_conv_pct muestra si los que exploran llegan a comprar. Ordenar por la segunda deja arriba a las fuentes cuyos visitantes con interacción compran.

        Salvedades para el paquete

        • Las conversiones son sesiones convertidas de último contacto, no pedidos. Los pedidos de la app y del marketplace no están en los datos de sesiones.
        • Solo los clientes conocidos pueden convertir aquí, así que las fuentes con muchos visitantes anónimos se ven más débiles.
        • Faltan doce filas de día/canal en marketing_spend por caídas del seguimiento, así que algunos totales anuales están ligeramente bajos.

        Errores comunes

        • Sumar el gasto después de un join con las sesiones.
        • Dividir las conversiones entre todas las sesiones en la tasa del paso, lo que repite la tasa global.
        • Filtrar 2025 con year() = 2025 en una tabla y con un rango de fechas en la otra y obtener ventanas distintas. Usa la misma regla en ambos lados.

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