La solicitud

De Jessica Turner, Gerente de Merchandising
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
categoryfeed_rowswith_costwith_pricependiente - 3 filas, ordenadas como se pidependiente
Paso 2 de 3. Partiendo del feed cargado (en el starter), límpialo: fija category en 'Lighting' en toda fila cuya category recortada y en minúsculas sea 'lighting', y elimina las filas sin list_price. Devuelve todas las filas restantes con sku, product_name, category, unit_cost y list_price, ordenadas por sku.
- Lee de la tabla
productspendiente - Muestra exactamente
skuproduct_namecategoryunit_costlist_pricependiente - 22 filas, ordenadas como se pidependiente
Paso 3 de 3. Partiendo del feed limpio (en el starter), crea una tabla lighting_summary con una fila por nivel ('premium' cuando list_price >= 300, y en otro caso 'core'): tier, products (filas), with_cost (filas con unit_cost), avg_price (promedio de list_price, redondeado a 2) y avg_margin_pct (promedio de (list_price - unit_cost) / list_price por 100 sobre las filas con costo, redondeado a 1). Luego devuelve todas las columnas de lighting_summary más rows_match (verdadero cuando los products del resumen suman el número de filas de lighting_feed), ordenado por tier.
- Lee de la tabla
productspendiente - Muestra exactamente
tierproductswith_costavg_priceavg_margin_pctrows_matchpendiente - 2 filas, ordenadas como se pidependiente
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
| 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
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').
¡Linterna encendida!
Practicaste: create tableinsert selectupdatedeletecreate table asvalidationanalyst workflow
- Resuelto
- Sin pistas
- Al primer intento
