1. Faro

Nivel 7 · Desafío final: la revisión del P&L por categoría

La solicitud

De Laura Bennett, Directora de Finanzas

“Para la revisión trimestral necesito un P&L de 2025 por categoría: primero qué parte de las ventas cubren nuestros datos de costos, luego el margen bruto por categoría y después lo que queda tras los reembolsos. Catherine va a preguntar cuál es realmente nuestra categoría más rentable, así que la tabla tiene que aguantar.”

Tu objetivo

Paso 1 de 3. Devuelve una fila con lines (todas las líneas de l), lines_without_cost (líneas cuyo unit_cost es NULL), net_sales (todo el net), net_sales_without_cost (net en las líneas sin costo) y coverage_pct (net en las líneas con costo × 100 / todo el net). Redondea el dinero y el porcentaje a 2.

  • Lee de la tabla productspendiente
  • Lee de la tabla orderspendiente
  • Muestra exactamente lines lines_without_cost net_sales net_sales_without_cost coverage_pctpendiente

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

        Un P&L en tres bloques

        Un P&L por categoría para una revisión tiene una forma fija: qué cubren los números, margen bruto y contribución después de los costos variables que puedes medir. Cada paso de este Desafío final es un bloque, todos sobre 2025.

        Paso 1: primero la cobertura

        Nueve productos no tienen costo unitario. Sus líneas no pueden tener margen, así que cada cifra de margen cubre menos que todas las ventas. Antes de mostrar cualquier margen, di cuánto cubre:

        SUM(net) FILTER (WHERE unit_cost IS NOT NULL) * 100.0 / SUM(net)

        FILTER restringe un agregado a algunas filas mientras los demás siguen viéndolas todas, así que una sola consulta da el total, la parte sin cubrir y la proporción.

        Paso 2: margen bruto por categoría

        El mismo cálculo del nivel 1, ahora en SQL sobre un año. Filtra a las líneas con costo, agrupa por categoría y divide sumas: SUM(net - cogs) * 100.0 / SUM(net). Ordena por dólares de margen, porque la primera pregunta en una revisión es de dónde viene el dinero.

        Paso 3: contribución

        Resta también los reembolsos, como en el nivel 2. Una categoría con buen margen bruto y muchas devoluciones puede terminar por debajo de una con un margen algo menor y pocas devoluciones. Esta vez ordena por contribución %: la pregunta cambió a “dónde deja más un dólar de ventas”.

        Leer la tabla completa

        Los tres bloques juntos cuentan una historia que ningún número solo cuenta. Outdoor es la categoría más grande en ventas, en dólares de margen y en dólares de contribución, y la más débil por dólar una vez que se cuentan las devoluciones. Kitchen es lo contrario: más pequeña, y la más eficiente. Ambas afirmaciones van en la revisión, junto a la nota al pie de cobertura.

        Errores comunes

        • Dejar las líneas sin costo en el paso 2. cogs es NULL en ellas; SUM ignora los NULL, así que sus ventas cuentan como margen puro.
        • Dividir entre el total equivocado. La contribución % divide entre las ventas netas de la propia categoría, no entre el total de la tienda.
        • Ordenar por una columna y llamarla ganadora. Los dólares y las tasas responden preguntas distintas.

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