1. Faro

Nivel 2 · Encuentra los productos de baja rotación en SQL

La solicitud

De Thomas Whitaker, Director de Merchandising

“Lo acordamos: productos activos a la venta todo 2025, cada uno frente a su propia categoría, los tres más débiles por categoría. Primero muéstrame qué productos estás juzgando y cuáles dejas fuera, y si algo no se vendió en absoluto.”

Tu objetivo

Paso 1 de 3. Revisa qué productos se pueden juzgar. Etiqueta cada producto con product_group: 'retired' si is_active es falso, si no 'new in 2025' si launched_on >= '2025-01-01', si no 'established'. Devuelve product_group, products (el número de productos), sold_in_2025 (cuántos tuvieron alguna venta en 2025) y missing_cost (cuántos tienen unit_cost NULL). Ordena por product_group.

  • Lee de la tabla productspendiente
  • Lee de la tabla orderspendiente
  • Muestra exactamente product_group products sold_in_2025 missing_costpendiente

Paso 1 · tu consulta

SQL

Cargando el editor…

    ResultadoVista previa de products · presiona Ejecutar para ver el tuyo
    Vista previa de products
    product_idnamecategorysubcategoryunit_price
    101Vale Velvet LoveseatFurnitureSofas1659.00
    102Alder Oak Coffee TableFurnitureTables919.00
    103Orchard Rattan Dining ChairFurnitureChairs789.00
    104Upland Oak BookcaseFurnitureStorage429.00

    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 products · presiona Ejecutar para ver el tuyo
      Vista previa de products
      product_idnamecategorysubcategoryunit_price
      101Vale Velvet LoveseatFurnitureSofas1659.00
      102Alder Oak Coffee TableFurnitureTables919.00
      103Orchard Rattan Dining ChairFurnitureChairs789.00
      104Upland Oak BookcaseFurnitureStorage429.00

      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 products · presiona Ejecutar para ver el tuyo
        Vista previa de products
        product_idnamecategorysubcategoryunit_price
        101Vale Velvet LoveseatFurnitureSofas1659.00
        102Alder Oak Coffee TableFurnitureTables919.00
        103Orchard Rattan Dining ChairFurnitureChairs789.00
        104Upland Oak BookcaseFurnitureStorage429.00

        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.

        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
        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
        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 revisando, y por qué

        Antes de clasificar nada, decide qué productos se pueden juzgar con justicia. Tres grupos se comportan de forma distinta:

        • Los productos retirados ya están saliendo de la gama; pertenecen a otra revisión.
        • Los productos nuevos en 2025 tuvieron solo parte del año a la venta. Un farol lanzado en agosto no se puede comparar con uno que vendió todo el verano.
        • Los productos consolidados estuvieron a la venta los doce meses: esos son los que hay que clasificar.

        El paso 1 etiqueta cada producto con un CASE y cuenta. Parte de products con un LEFT JOIN a las ventas de 2025, así que un producto que no vendió nada aparecería igualmente, con ventas NULL:

        FROM products AS p
        LEFT JOIN sales AS s ON s.product_id = p.product_id

        COUNT(s.product_id) cuenta entonces solo los productos que vendieron. El mismo paso cuenta los costos unitarios faltantes, porque un producto lento con un costo desconocido es uno cuyo margen nadie puede juzgar.

        Clasificar dentro de cada categoría

        El paso 2 necesita dos números para cada producto que dependen de su categoría: el total de la categoría y la posición del producto. Las funciones de ventana dan ambos sin colapsar las filas:

        s.revenue * 100.0 / SUM(s.revenue) OVER (PARTITION BY p.category) AS share,
        ROW_NUMBER() OVER (PARTITION BY p.category ORDER BY s.revenue) AS rn

        PARTITION BY reinicia el cálculo para cada categoría. Como las funciones de ventana se ejecutan después de WHERE, el filtro rn <= 3 va en la consulta exterior.

        El paso 3 vuelve a clasificar y luego agrega: SUM(CASE WHEN rn <= 3 THEN revenue ELSE 0 END) conserva los tres más débiles, SUM(revenue) toda la categoría.

        Cómo leer el resultado

        category producto más débil units_2025 category_share_pct
        Furniture Upland Oak Bookcase 9 0.7
        Textiles Spruce Wool Duvet Cover 25 0.7
        Outdoor Orchard Aluminum Adirondack Chair 93 1.0
        Lighting Fern Rattan Desk Lamp 13 1.2

        La proporción de ingresos y las unidades juntas cuentan la historia. La estantería y la lámpara de escritorio casi no vendieron nada; la silla Adirondack vendió 93 unidades pero a $51.99 cada una, así que apenas se nota en una categoría de juegos de patio y parrillas.

        Errores comunes

        • Un producto con ventas NULL se cae de un JOIN interno; parte de products cuando necesites todos los productos.
        • ROW_NUMBER rompe los empates de forma arbitraria; con ingresos al centavo los empates son raros, pero di qué regla usaste.
        • Una proporción de ingresos no dice nada sobre la ganancia. Siete productos consolidados no tienen costo unitario, así que su margen se desconoce.

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