La solicitud

De Jessica Turner, Gerente de Merchandising
Tu objetivo
Paso 1 de 3. Desde products, devuelve product_id, name, unit_price y sale_price, donde sale_price es unit_price reducido un 10 %, redondeado a 2 decimales.
- Lee de la tabla
productspendiente - Muestra exactamente
product_idnameunit_pricesale_pricependiente - 120 filaspendiente
Paso 2 de 3. Desde products, devuelve product_id, name y cost_share_pct: unit_cost como porcentaje de unit_price (unit_cost / unit_price * 100), redondeado a 1 decimal. Incluye todos los productos.
- Lee de la tabla
productspendiente - Muestra exactamente
product_idnamecost_share_pctpendiente - 120 filaspendiente
Paso 3 de 3. Desde orders, devuelve cada combinación única de channel y status, como dos columnas llamadas channel y status.
- Lee de la tabla
orderspendiente - Muestra exactamente
channelstatuspendiente - 12 filaspendiente
Paso 1 · 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.
Paso 2 · 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.
Paso 3 · tu consulta
Cargando el editor…
Solución de referencia
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace |
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 |
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 |
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 |
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
Los Desafíos finales son casos pequeños. Cada paso se revisa por separado y, juntos, responden la solicitud completa. Este usa todo lo del capítulo: elegir columnas, calcular nuevas, nombrarlas, redondear y eliminar duplicados.
Paso 1: la lista de precios de oferta
Un descuento del 10 % significa que el cliente paga el 90 % del precio, así que el precio de oferta es unit_price * 0.9.
Escribirlo como una multiplicación es más claro y menos propenso a errores que unit_price - unit_price * 0.1,
aunque ambos dan la misma respuesta. Redondea el resultado a centavos y ponle un alias legible:
ROUND(unit_price * 0.9, 2) AS sale_price
Mantén el unit_price original a su lado. Quienes leen una lista de precios quieren comparar los dos
números uno junto al otro, y un analista que muestra la entrada junto a la salida hace que los errores sean fáciles
de detectar.
Paso 2: proporción del costo
Los equipos de finanzas suelen hablar del costo como una proporción del precio (la vista inversa del margen). Si una lámpara
se vende por 80 y cuesta 32, la proporción del costo es 40 %. La expresión es unit_cost / unit_price * 100.
Algunos productos no tienen costo registrado, así que su proporción de costo es NULL. Déjalos como NULL: un costo
desconocido no es un costo cero, y rellenar con 0 haría que esos artículos parecieran ganancia pura en la
diapositiva de la junta.
Una comprobación rápida que hacen los analistas con una columna como esta: ¿todos los valores están entre 0 y 100? Una proporción de costo superior a 100 significa que el producto se vende con pérdida, algo que vale la pena señalarle a Jessica en lugar de pasarlo en silencio.
Paso 3: canales y estados
SELECT DISTINCT channel, status FROM orders lista cada combinación una vez. Con tres canales y
cuatro estados esperarías como máximo doce filas. Si ves menos, alguna combinación nunca
ocurre. Si ves más, los datos tienen variantes de escritura, y eso ya es un hallazgo.
Qué comprobaría quien revisa
- Cada columna calculada tiene un alias claro.
- El redondeo ocurre una sola vez, sobre el valor final.
- Los NULL se dejan como NULL salvo que haya una razón de negocio para rellenarlos.
- El resultado tiene solo las columnas que se pidieron.
Esos cuatro hábitos te ahorrarán la mayoría de los comentarios que recibirías en una revisión de código como analista junior.
Errores comunes
- Multiplicar por el descuento en lugar de por lo que queda.
unit_price * 0.1es el 10 % que se quita, no el precio de oferta. El cliente paga el 90 %, así que escribeunit_price * 0.9. - Redondear las entradas en lugar del resultado.
ROUND(unit_price, 2) * 0.9aún puede devolver tres decimales. Redondea una sola vez, alrededor de toda la expresión:ROUND(unit_price * 0.9, 2). - Convertir un costo que falta en 0. Una proporción de costo desconocida debe seguir siendo NULL; un 0 le dice al lector que el producto no cuesta nada fabricarlo.
- Esperar que
DISTINCTfuncione solo con la primera columna.SELECT DISTINCT channel, statuselimina los pares duplicados, así que cada canal aparece una vez por cada estado que tiene, no una sola vez en total.
En SQL Server
Los tres pasos se ejecutan allí sin cambios: la aritmética con decimales, ROUND(x, 2) y SELECT DISTINCT se comportan
igual. La diferencia que hay que recordar es la unión de texto, que usa + en lugar de ||.
¡Linterna encendida!
Practicaste: selectexpressionsaliasrounddistinct
- Resuelto
- Sin pistas
- Al primer intento
