1. Faro

Nivel 6 · Gasto de marketing por canal

La solicitud

De Jordan Reyes, Director de Marketing

“Para la revisión del presupuesto necesito una tabla sencilla por canal de marketing: cuántos días tenemos gasto registrado, el gasto total de los tres años y el promedio por día.”

Tu objetivo

Desde marketing_spend, devuelve una fila por channel con: channel, spend_days (número de filas), total_spend (suma de amount, redondeada a 2) y avg_daily_spend (promedio de amount, redondeado a 2).

  • Lee de la tabla marketing_spendpendiente
  • Muestra exactamente channel spend_days total_spend avg_daily_spendpendiente
  • 3 filaspendiente

Tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de marketing_spend · presiona Ejecutar para ver el tuyo
    Vista previa de marketing_spend
    spend_datechannelamount
    2023-01-01paid492.99
    2023-01-01email37.38
    2023-01-01social200.53
    2023-01-02paid709.13

    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.

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

    La lección

    Una fila por canal con unos pocos totales es la forma más común de una consulta de agregación. Esta se ejecuta sobre marketing_spend, que tiene una fila por día y por canal de pago.

    Un grupo por canal, un valor por agregado

    SELECT
      channel,
      COUNT(*) AS spend_days,
      ROUND(SUM(amount), 2) AS total_spend
    FROM marketing_spend
    GROUP BY channel;

    Email tiene 1,092 días y $100,187.71 en total, social 1,093 días y $345,764.76, y paid 1,091 días y $888,774.13. Cada columna de la lista de SELECT está en el GROUP BY (channel) o dentro de un agregado. Esa es la regla que mantiene válida una consulta agrupada.

    Deja que el conteo revise los datos

    Del 2023-01-01 al 2025-12-31 hay 1,096 días. Ningún canal llega a esa cifra: a paid le faltan 5 días, a email 4 y a social 3, doce en total. Las notas de los datos las llaman caídas de seguimiento. Nadie pidió una revisión de calidad de datos, pero COUNT(*) te dio una gratis, y cambia cómo leer los promedios: AVG(amount) es el promedio sobre los días con datos, no sobre todos los días del calendario. Si los días faltantes de verdad tuvieron gasto, el total real es un poco más alto que el reportado. Menciónalo en una línea cuando envíes la tabla.

    Errores comunes

    • Seleccionar channel sin GROUP BY channel. DuckDB reporta que la columna debe aparecer en la cláusula GROUP BY o usarse en una función de agregación.
    • Redondear dentro de la suma, SUM(ROUND(amount, 2)). Redondea el número final una sola vez.
    • Llamar al promedio “por día” sin decir que omite los días faltantes.
    • Usar COUNT(DISTINCT spend_date) y esperar una respuesta distinta. Hay una fila por canal y día, así que da los mismos conteos aquí. Solo difiere cuando una tabla puede tener varias filas para el mismo día, algo que conviene comprobar una vez en cualquier tabla nueva.
    • Comparar canales solo por los totales. Paid gasta casi nueve veces más que email en total, y el promedio diario muestra la misma brecha, pero ningún número dice qué canal se gana su presupuesto. Eso requiere ingresos o conversiones junto al gasto.

    En SQL Server

    Esta consulta se ejecuta sin cambios, porque amount es un decimal. Una diferencia que conviene conocer: AVG de una columna INT devuelve un INT allí, así que un promedio de números enteros pierde sus decimales. Convierte primero:

    SELECT device, AVG(CAST(pages_viewed AS decimal(10, 2))) AS avg_pages
    FROM web_sessions
    GROUP BY device;

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