1. Faro

Nivel 2 · Verifica y mide la mezcla de canales en SQL

La solicitud

De Daniel Foster, Gerente de producto móvil

“Acordamos la pregunta: la participación de cada canal en pedidos completados e ingresos por año, y si el crecimiento de la app es negocio nuevo o pedidos que se pasan del sitio web. Empieza mostrándome que los datos sirven para esto. Diciembre de 2025 todavía no está del todo asentado.”

Tu objetivo

Paso 1 de 3. Verifica los datos. Para cada canal, cuenta todos los pedidos por estado: devuelve channel, completed, cancelled, refunded, pending y pending_late (pedidos pendientes hechos el 2025-12-22 o después), ordenado por channel. Usa solo la tabla orders.

  • Lee de la tabla orderspendiente
  • Muestra exactamente channel completed cancelled refunded pending pending_latependiente
  • 3 filas, ordenadas como se pidependiente

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 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 3 · 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.

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

        Qué estás verificando y por qué

        Antes de medir participaciones, asegúrate de que las dos columnas en las que se apoya el análisis estén limpias: channel y status. Una consulta hace ambas, pivotando los estados a columnas con conteos condicionales:

        COUNT(CASE WHEN status = 'completed' THEN 1 END) AS completed

        COUNT omite los NULL, y un CASE sin ELSE devuelve NULL cuando la condición falla, así que solo se cuentan las filas que coinciden. Tres cosas que leer en el resultado:

        • El número de filas. Una por valor de canal. Una cuarta fila como App significaría mayúsculas que corregir.
        • Pedidos pendientes. Daniel advirtió que diciembre no está asentado. pending_late muestra cuántos de los pedidos pendientes son simplemente recientes.
        • Cancelaciones por canal. Si un canal canceló mucho más, usar los pedidos completados inclinaría la mezcla. Aquí todos están cerca del 6%.

        Participaciones dentro de cada año

        Una participación sobre el total necesita el total del grupo de cada fila a su lado. Una función de ventana lo hace sin colapsar las filas:

        orders * 100.0 / SUM(orders) OVER (PARTITION BY year)

        PARTITION BY year reinicia el total en cada año, así que las tres participaciones de cada año suman 100%. Agrega primero por año y canal en una CTE y luego aplica la ventana al resultado.

        ¿Mezcla o crecimiento?

        Una participación creciente tiene dos historias posibles. O la app creció mientras los demás se mantenían, o la app se mantuvo mientras los demás caían. Normalmente es un poco de ambas, y solo los conteos las distinguen. El paso 3 pone 2024 y 2025 lado a lado con agregación condicional:

        COUNT(CASE WHEN year = 2024 THEN 1 END) AS o24,
        COUNT(CASE WHEN year = 2025 THEN 1 END) AS o25

        Cómo leer el resultado

        channel orders_2024 orders_2025 orders_change_pct aov_2025
        app 1239 1904 53.7 523.27
        marketplace 543 630 16.0 515.01
        web 1891 1761 -6.9 557.03

        La tienda creció en 2025 y el marketplace mantuvo el ritmo. La app creció mucho más rápido, y el sitio web se encogió. Los datos no pueden decir qué clientes se pasaron; un seguimiento a nivel de cliente mostraría cuántos compradores web de 2024 pidieron a través de la app en 2025.

        Trampas

        • Usar COUNT(*) tras unir con order_items cuenta líneas, no pedidos. Usa COUNT(DISTINCT o.order_id) o resume primero a pedidos.
        • Una participación sin los conteos detrás puede ocultar un mercado que se encoge.
        • shipping_fee es lo que el cliente pagó por la entrega, no la comisión que nos cobra el marketplace.

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