1. Faro

Nivel 6 · Niveles de envío por canal

La solicitud

De Kevin Brooks, Gerente de Operaciones

“Nuestro contrato con el transportista está por renovarse. Para 2025, ¿cuántos pedidos completados por canal se enviaron gratis, estándar, exprés o como carga? ¿Y qué proporción de los pedidos de cada canal se envió gratis?”

Tu objetivo

Para los pedidos con status 'completed' hechos en 2025, devuelve una fila por canal con: channel, orders (todos esos pedidos), free_orders (shipping_fee = 0), standard_orders (shipping_fee mayor que 0 y menor que 10), express_orders (al menos 10 y menor que 40), freight_orders (40 o más) y free_pct (free_orders / orders * 100, redondeado a 1).

  • Lee de la tabla orderspendiente
  • Muestra exactamente channel orders free_orders standard_orders express_orders freight_orders free_pctpendiente
  • 3 filaspendiente

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

    Esta práctica combina dos herramientas del capítulo: CASE para clasificar filas en tramos y la agregación condicional para contar cada tramo en su propia columna.

    Repaso: una columna por tramo

    GROUP BY da una fila por grupo. Para obtener los tramos como columnas en lugar de filas adicionales, cuenta cada condición por separado:

    SELECT channel,
           COUNT(*) AS orders,
           COUNT(CASE WHEN coupon_code IS NOT NULL THEN 1 END) AS coupon_orders
    FROM orders
    WHERE status = 'completed'
      AND order_date >= '2025-01-01'
      AND order_date < '2026-01-01'
    GROUP BY channel;

    Para 2025 esto da web 256 pedidos con cupón de 1,761, app 277 de 1,904 y marketplace 84 de 630. Cada condición extra es una columna más, y la tabla se sigue leyendo una sola vez, por eso este patrón supera a escribir una consulta por tramo y pegar los resultados en una hoja de cálculo.

    El CASE devuelve 1 para las filas que coinciden y NULL para el resto, así que COUNT cuenta solo las coincidencias. SUM(CASE WHEN ... THEN 1 ELSE 0 END) da el mismo número y también es común.

    Las tarifas de envío de los pedidos de Harbor & Pine toman pocos valores: 0 cuando el pedido califica para envío gratis, 6.95 estándar, 14.95 exprés y 49.00 carga en web y app, mientras que los pedidos de marketplace llevan 4.99 o una tarifa con recargo (7.65, 16.45, 53.90). Usar rangos en el CASE, en lugar de valores exactos, coloca ambas listas de precios en los niveles correctos.

    En 2025 el canal web tuvo 1,761 pedidos completados, 1,351 de ellos enviados gratis (76.7 %). Marketplace tuvo 630 y ninguno se envió gratis.

    Errores comunes

    • Huecos y solapamientos. Escribe los rangos con >= en el límite inferior y < en el superior, para que cada tarifa caiga en exactamente un nivel. Una comprobación rápida: free + standard + express + freight debe ser igual a orders.
    • Porcentajes enteros. Multiplica primero por 100.0, para que la división conserve los decimales en todos los dialectos de SQL.
    • Contar el CASE con ELSE 0. COUNT(CASE WHEN ... THEN 1 ELSE 0 END) cuenta todas las filas, porque 0 no es NULL. Con ELSE 0, usa SUM.

    En SQL Server

    La agregación condicional funciona igual. La división entera es una trampa real allí: 100 * free_orders / orders con dos enteros se trunca a un número entero, así que conserva el 100.0.

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