La solicitud

De Jessica Turner, Gerente de Merchandising
Tu objetivo
Arregla la consulta. Desde products, devuelve product_id, name, unit_price, unit_cost y markup_pct: (unit_price menos unit_cost) dividido entre unit_cost, por 100, redondeado a 1 decimal. Incluye todos los productos; los productos sin costo conservan un markup_pct NULL.
- Lee de la tabla
productspendiente - Muestra exactamente
product_idnameunit_priceunit_costmarkup_pctpendiente - 120 filaspendiente
Tu consulta
Cargando el editor…
Solución de referencia
| product_id | name | category | subcategory | unit_price |
|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Jessica, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NULL | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NULL |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NULL |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NULL |
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NULL |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NULL |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NULL | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NULL | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NULL | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NULL | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NULL | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
Esta consulta se ejecuta, devuelve los 120 productos y no muestra ningún mensaje de error. Aun así está mal, que es el tipo de error más peligroso. El ticket da la pista: cada markup es igual al precio menos 100.
Cómo lee SQL la aritmética
SQL sigue las matemáticas de la escuela. * y / se ejecutan antes que + y -, y los operadores del mismo nivel se ejecutan de izquierda
a derecha. Así, la expresión del código inicial
unit_price - unit_cost / unit_cost * 100
se lee como unit_price - ((unit_cost / unit_cost) * 100). Cualquier número dividido entre sí mismo es 1, así que
todo es unit_price - 100. La Alder Oak Coffee Table cuesta $919, por eso muestra 819. Los paréntesis
fuerzan el orden que quieres:
SELECT
name,
unit_price,
unit_cost,
ROUND((unit_price - unit_cost) / unit_cost * 100, 1) AS markup_pct
FROM products;
Ahora la mesa de centro, con un costo de $503.50, tiene un markup de 82.5 %: se vende por un 82.5 % más de lo que cuesta. El Vale Velvet Loveseat no tiene costo registrado, así que su markup sigue siendo NULL, que es lo honesto.
¿Markup o margen?
El nivel del margen dividía la ganancia entre el precio. El markup divide la misma ganancia entre el costo. Para la mesa de centro eso es un margen de 45.2 % y un markup de 82.5 %. Ambos son correctos, responden preguntas distintas, y los compradores suelen hablar en markup mientras finanzas habla en margen. Cuando un ticket dice “margen”, pregunta a cuál se refiere. Una regla práctica: el margen nunca puede llegar al 100 %, mientras que el markup a menudo sí, así que un “margen” superior a 100 % en realidad es un markup, o un error.
Errores comunes
- Detectar un patrón y no confiar en él. “Todos los valores son el precio menos 100” es una pista fuerte de que una parte de la expresión se colapsó a una constante. Lee la fórmula operador por operador.
- Poner los paréntesis en el lugar equivocado:
unit_price - (unit_cost / unit_cost) * 100no cambia nada, porque escribe lo que la base de datos ya hacía. - Verificar solo la primera fila. Revisa un producto barato y uno caro, y asegúrate de que un producto con costo NULL siga mostrando NULL en lugar de un número.
En SQL Server
La precedencia de operadores es la misma, así que los mismos paréntesis lo arreglan. Ojo también con los tipos: si ambas
columnas fueran INT allí, (price - cost) / cost se truncaría a un número entero antes del * 100.
Multiplica primero o usa 100.0:
SELECT ROUND((ListPrice - StandardCost) * 100.0 / StandardCost, 1) AS MarkupPct
FROM Production.Product; ¡Linterna encendida!
Practicaste: operator precedenceexpressionsdebuggingnull arithmetic
- Resuelto
- Sin pistas
- Al primer intento
