La solicitud

De Rachel Adams, Responsable de Atención al Cliente
Tu objetivo
Usa las líneas de pedido de los pedidos completados realizados en 2025, excluyendo las líneas con quantity <= 0. Devuelve una fila por categoría con: category, lines (líneas de pedido), returned_lines (líneas que tienen una fila en returns), return_rate_pct (returned_lines / lines * 100, redondeado a 1) y total_check (verdadero cuando la suma de lines en todas las categorías es igual al número de líneas limpias). Ordena por return_rate_pct descendente y luego por category.
- Lee de la tabla
productspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
categorylinesreturned_linesreturn_rate_pcttotal_checkpendiente
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 Rachel, 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 |
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 |
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 |
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
Todo análisis sigue más o menos el mismo camino, sea cual sea la herramienta. Escribirlo como etapas hace el SQL más fácil de construir, más fácil de revisar y mucho más fácil de defender cuando alguien cuestiona el número.
Las etapas
- Entender la petición. ¿Qué decisión alimenta? Aquí: la dotación de personal para devoluciones. ¿Qué se cuenta exactamente? Una tasa de devolución por categoría, como proporción de líneas de pedido, en 2025.
- Explorar claves y grano.
order_itemstiene una fila por línea;returnstiene como máximo una fila pororder_item_id;productsda la categoría. El grano de la respuesta es una fila por categoría. - Extraer las filas del alcance: líneas de pedidos completados realizados en 2025.
- Limpiar: descartar las líneas con cantidad cero o menor.
- Agregar al grano solicitado.
- Estructurar los pasos como CTE con nombre para poder ejecutar y comprobar cada una por separado.
- Analizar más si hace falta (rankings, participaciones, tendencias con funciones de ventana).
- Validar: ¿las partes suman el todo? ¿Son plausibles los conteos de filas en cada paso?
- Presentar: una tabla ordenada con una frase de interpretación.
La consulta, etapa por etapa
El starter es la etapa 3. Ejecutarlo solo devuelve 10,810 líneas, la primera comprobación de sensatez. La
CTE de limpieza elimina 10 líneas con una cantidad mala, dejando 10,800. El agregado une products y hace
LEFT JOIN con returns: un LEFT JOIN, porque las líneas sin devolución deben quedarse en el denominador, y
COUNT(r.return_id) cuenta solo las coincidentes.
La validación es una columna, no un memorándum aparte:
SUM(lines) OVER () = (SELECT COUNT(*) FROM clean_lines) AS total_check
SUM(lines) OVER () suma los seis conteos por categoría; la subconsulta cuenta directamente las líneas
limpias. Si a un producto le faltara una categoría, o un join duplicara líneas, los dos diferirían y la
columna diría falso.
El resultado: Textiles 4.2% (92 de 2,195 líneas), Lighting 3.9%, Outdoor 3.7%, Furniture 3.6%, Decor 2.9% y Kitchen 2.0% (51 de 2,548). Furniture tiene menos líneas (586), así que su tasa se mueve más con un puñado de devoluciones; dilo cuando lo presentes.
Valida antes de presentar
Comprobaciones útiles para casi cualquier análisis:
- Conteos de filas tras cada CTE, comparados con lo que esperas según la documentación de los datos.
- Partes frente al todo, como arriba.
- Una entidad rastreada de principio a fin: elige un pedido y confirma sus líneas y devoluciones a mano.
- Una comparación con un número en el que alguien ya confía, como el informe del mes pasado.
Errores comunes
- Saltarse la etapa 1 y responder otra pregunta: devoluciones por pedido en lugar de por línea, o dólares reembolsados en lugar de conteos.
- INNER JOIN a returns, que hace que todas las tasas sean 100%.
- Incluir pedidos reembolsados, cuyas líneas están todas devueltas por definición, sin decirlo.
- Presentar una tasa sin su denominador.
En SQL Server
La cadena de CTE, el LEFT JOIN y COUNT(column) son idénticos en T-SQL. Dos diferencias: una expresión
booleana no puede ser una columna, así que escribe la comprobación como
CASE WHEN SUM(lines) OVER () = (SELECT COUNT(*) FROM clean_lines) THEN 1 ELSE 0 END, y
100.0 * returned_lines / lines necesita el 100.0, porque / entre dos enteros trunca en SQL Server.
¡Linterna encendida!
Practicaste: analyst workflowctegrainvalidationreturn rate
- Resuelto
- Sin pistas
- Al primer intento
