La solicitud

De Rachel Adams, Líder de Atención al Cliente
Tu objetivo
Une returns con order_items (por order_item_id) y order_items con products (por product_id). Para las devoluciones con returned_on en 2025, devuelve una fila por categoría con: category, returns (número de devoluciones), total_refund (suma de refund_amount, redondeada a 2) y avg_refund (promedio de refund_amount, redondeado a 2). Ordena por total_refund descendente.
- Lee de la tabla
productspendiente - Lee de la tabla
order_itemspendiente - Muestra exactamente
categoryreturnstotal_refundavg_refundpendiente
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 |
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 |
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 |
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
Muchas preguntas necesitan más de dos tablas. Aquí la devolución conoce su línea de pedido, la línea de pedido conoce su producto, y solo el producto conoce su categoría. Recorres la cadena un join a la vez.
Encadenar joins
Cada JOIN añade una tabla usando una clave que comparte con una tabla que ya está en la consulta:
SELECT o.channel,
COUNT(*) AS returns,
ROUND(SUM(r.refund_amount), 2) AS refunded
FROM returns AS r
JOIN order_items AS i ON i.order_item_id = r.order_item_id
JOIN orders AS o ON o.order_id = i.order_id
WHERE r.returned_on >= '2025-01-01'
GROUP BY o.channel
ORDER BY returns DESC;
Esto va de las devoluciones a la línea de pedido, y luego al pedido, y reporta las devoluciones de 2025 por canal: web 289, app 286 y marketplace 84. Tu ticket toma la otra rama, de la línea de pedido a products.
Antes de agrupar, pregúntate qué significa una fila tras los joins. Una devolución coincide con una línea de pedido y una línea tiene
un producto, así que cada devolución sigue siendo una fila. Por eso COUNT(*) cuenta devoluciones aquí. Unir en la
otra dirección, de un producto a sus muchas líneas, multiplicaría las filas.
Fíjate también en que el filtro de fecha está en returned_on, la fecha en que el dinero se devolvió, no en la fecha del pedido.
Una devolución procesada en enero de 2025 de un pedido de diciembre de 2024 es un reembolso de 2025.
Una comprobación rápida tras cualquier cadena de joins: cuenta las filas antes de agrupar y compáralas con la tabla cuyo grano quieres. Aquí las filas unidas de 2025 son 659, las mismas que las filas de 2025 en returns, así que no se perdió ni se duplicó ninguna fila por el camino.
Errores comunes
- Saltarse el puente. No hay ninguna columna que enlace returns con products directamente, así que el camino tiene que pasar por order_items.
- Columna de fecha equivocada. Filtrar por la fecha del pedido responde a otra pregunta.
- Ordenar por el número equivocado. Decor tiene más devoluciones en 2025 (179) pero un reembolso promedio de solo
$100.82, mientras que Furniture tiene 35 devoluciones con un promedio de $994.22. Ordena por
total_refund, no porreturns.
En SQL Server
Los joins son idénticos. Solo cambia el estilo del literal de fecha si prefieres valores tipados:
WHERE r.returned_on >= '20250101' AND r.returned_on < '20260101' funciona en SQL Server, y
'2025-01-01' también funciona con una columna date.
¡Linterna encendida!
Practicaste: inner joinmulti table joingroup bysumavg
- Resuelto
- Sin pistas
- Al primer intento
