1. Faro

Nivel 8 · Desafío final: importa, limpia y publica

La solicitud

De Jessica Turner, Gerente de Merchandising

“Estamos fusionando las lámparas del nuevo proveedor en nuestra gama de Lighting. Necesito la lista combinada cargada en una tabla, limpia, y un pequeño resumen por nivel de precio con márgenes que pueda entregar a Laura en finanzas. Por favor demuéstrame que no se perdió nada por el camino.”

Tu objetivo

Paso 1 de 3. Crea lighting_feed (sku INTEGER, product_name VARCHAR, category VARCHAR, unit_cost DECIMAL(10, 2), list_price DECIMAL(10, 2)). Carga todos los productos de Lighting de products con INSERT ... SELECT (product_id, name, category, unit_cost, unit_price), conserva las tres filas de proveedor del starter y luego perfila el feed: devuelve category, feed_rows (conteo de filas), with_cost (filas con unit_cost) y with_price (filas con list_price) por cada valor de category exactamente como está guardado, ordenado por category.

  • Lee de la tabla productspendiente
  • Muestra exactamente category feed_rows with_cost with_pricependiente
  • 3 filas, ordenadas como se pidependiente

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

        Este desafío final ejecuta una pequeña importación de principio a fin: el tipo de trabajo en el que la lista de un proveedor se une a tu catálogo y alguien más adelante depende del resultado. Como cada ejecución empieza de cero, cada paso repite las sentencias de los pasos anteriores (los starters las incluyen) y añade las suyas.

        Paso 1: cargar y perfilar

        Un INSERT puede tomar sus filas de una consulta en lugar de una lista VALUES:

        INSERT INTO lighting_feed
        SELECT product_id, name, category, unit_cost, unit_price
        FROM products
        WHERE category = 'Lighting';

        Las columnas se emparejan por posición, así que el SELECT debe listarlas en el orden de la tabla. Las tres filas del proveedor siguen como VALUES.

        Luego perfila antes de limpiar. Agrupar por la category en bruto muestra lo que realmente llegó: 21 filas dicen Lighting, una dice LIGHTING y una dice ' lighting ' con espacios. Contar unit_cost y list_price por grupo muestra una fila sin costo (la Calder Arc Floor Lamp) y una sin precio (la Wren Ceramic Table Lamp). Un perfil como este es tu lista de tareas de limpieza.

        Paso 2: limpiar con UPDATE y DELETE

        UPDATE lighting_feed SET category = 'Lighting' WHERE LOWER(TRIM(category)) = 'lighting';
        DELETE FROM lighting_feed WHERE list_price IS NULL;

        El WHERE del UPDATE normaliza antes de comparar, así que una sola condición atrapa todas las grafías. El DELETE elimina el producto que todavía no se puede vender. El producto sin costo se queda: tiene precio, así que pertenece al catálogo, y su margen simplemente es desconocido. Eliminarlo también subestimaría el nivel premium. El feed limpio tiene 22 filas.

        Paso 3: publicar un resumen con una comprobación

        CREATE TABLE lighting_summary AS
        SELECT CASE WHEN list_price >= 300 THEN 'premium' ELSE 'core' END AS tier,
               COUNT(*) AS products,
               COUNT(unit_cost) AS with_cost,
               ROUND(AVG(list_price), 2) AS avg_price,
               ROUND(100 * AVG((list_price - unit_cost) / list_price), 1) AS avg_margin_pct
        FROM lighting_feed
        GROUP BY 1;

        AVG se salta los NULL, así que el promedio del margen cubre los 5 productos premium que tienen costo mientras products sigue contando los 6. Mostrar with_cost junto al margen le dice al lector en cuántas filas se apoya el margen. Los productos core promedian $135.81 con un margen del 56.4%; los premium promedian $407.33 con 53.9%.

        La consulta final añade rows_match: los conteos de productos del resumen deben sumar el feed. Si el CASE de los niveles tuviera un hueco (digamos > 300 y < 300, perdiendo un producto de exactamente $300), la comprobación pasaría a falso.

        Errores comunes

        • Listar las columnas de INSERT … SELECT en un orden distinto al de la tabla, lo que pone en silencio nombres en la columna de categoría o costos en la de precio.
        • Limpiar antes de perfilar, y arreglar solo las grafías que te ocurrió notar.
        • Eliminar las filas con costo NULL: son productos reales.
        • Publicar un resumen sin una comprobación de que cubre todas las filas.

        En SQL Server

        INSERT INTO ... SELECT y UPDATE/DELETE son iguales en T-SQL. El resumen se construiría con SELECT ... INTO dbo.LightingSummary FROM ..., y la comprobación se escribiría como una columna CASE WHEN ... THEN 1 ELSE 0 END, ya que T-SQL no tiene un tipo de columna booleano. Un archivo de proveedor real entraría por el asistente Import Flat File de SSMS; en DuckDB es INSERT INTO lighting_feed SELECT * FROM read_csv('feed.csv').

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