1. Faro

Nivel 5 · Convierte una hoja de precios pegada en números

La solicitud

De Jessica Turner, Gerente de Merchandising

“Nuestro proveedor envió los costos unitarios de la próxima temporada como una hoja pegada: signos de dólar, comas, algunos 'n/a'. La puse en una CTE. ¿Puedes alinearla con nuestro unit_cost actual para ver qué productos se encarecen?”

Tu objetivo

Conserva la CTE supplier_feed del starter. Convierte product_id_text a INTEGER y cost_text a DECIMAL(10,2) (quita primero '$', ',' y espacios; el texto que no sea un número pasa a ser NULL). Haz join con products por product_id, lo que descarta las filas del feed cuyo id no es un producto válido. Devuelve product_id, name, unit_cost (actual, de products), supplier_cost (el costo del feed convertido) y cost_change (supplier_cost menos unit_cost, redondeado a 2). Ordena por product_id.

  • Lee de la tabla productspendiente
  • Muestra exactamente product_id name unit_cost supplier_cost cost_changependiente
  • 10 filas, ordenadas como se pidependiente

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

    Los números escritos en una hoja de cálculo son texto hasta que los conviertes: '$1,012.50', ' 5.10 ', 'n/a'. Sumarlos o compararlos como texto no tiene sentido, así que el primer paso con cualquier archivo pegado es convertir cada columna a su tipo real.

    CAST y TRY_CAST

    CAST(x AS type) convierte o falla. Un solo valor malo y toda la consulta da error:

    SELECT CAST('$219.00' AS DECIMAL(10, 2));   -- Conversion Error

    TRY_CAST(x AS type) convierte o devuelve NULL. Eso es lo que quieres para limpiar, porque luego puedes contar e inspeccionar los NULL en lugar de buscar la fila que rompió la consulta.

    Antes de convertir, quita el formato que añadió una persona:

    TRY_CAST(REPLACE(REPLACE(TRIM(cost_text), '$', ''), ',', '') AS DECIMAL(10, 2))

    '$1,012.50' se convierte en '1012.50' y luego en el número 1012.50. 'n/a' y 'TBD' se convierten en NULL. La conversión de DuckDB ya tolera los espacios alrededor de un número, pero recortar primero deja clara la intención y funciona en todas las bases de datos.

    Leer el resultado

    En la tarea, el Vale Velvet Loveseat (101) no tiene unit_cost actual, así que su cost_change es NULL aunque el proveedor cotizó $1,012.50. El Oakley Jute Knit Throw (162) y el Elm Brass Floor Mirror (190) tienen un costo actual pero ninguna cotización utilizable. La fila '21x' nunca llega al resultado: su id no se convierte, así que el join la descarta. Ese descarte silencioso vale la pena reportarlo al proveedor.

    De timestamps a fechas

    Convertir no es solo para texto. orders.order_date es un TIMESTAMP, 2025-10-31 12:05:25 para el pedido 11500. CAST(order_date AS DATE) da 2025-10-31, que es por lo que agrupas o unes cuando la pregunta es “por día”. Comparar un timestamp con un valor solo de fecha coincide únicamente con la medianoche.

    Errores comunes

    • Un REPLACE de menos. TRY_CAST('1,012.50' AS DECIMAL(10,2)) es NULL. Una coma olvidada convierte en silencio en NULL todos los precios por encima de $999.
    • Convertir a INTEGER para dinero. Los centavos se redondean y desaparecen. Usa DECIMAL(10, 2).
    • No contar los NULL. Tras un TRY_CAST, ejecuta COUNT(*) - COUNT(supplier_cost) para ver cuántos valores fallaron.

    Dialectos y SQL Server

    BigQuery lo escribe SAFE_CAST, Snowflake tiene TRY_CAST y TRY_TO_NUMBER, Postgres no tiene una conversión segura (filtra antes con una expresión regular). SQL Server tiene TRY_CAST, TRY_CONVERT y TRY_PARSE, que entiende el formato de moneda de una cultura:

    SELECT TRY_CONVERT(DECIMAL(10, 2), REPLACE(REPLACE(cost_text, '$', ''), ',', '')) AS supplier_cost,
           TRY_PARSE('$1,012.50' AS MONEY USING 'en-US') AS parsed_money;

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