La solicitud

De Brian Mitchell, Analista Financiero
Tu objetivo
Arregla la consulta. Devuelve una fila por mes de 2025 con month (primer día del mes, un DATE) y refunds: la suma de refund_amount de returns (por el mes de returned_on, devoluciones de 2025) más el shipping_fee de cada pedido con estado 'refunded' y shipping_fee > 0 (por el mes de order_date, pedidos de 2025), redondeada a 2. Ordena por month.
- Lee de la tabla
orderspendiente - Lee de la tabla
returnspendiente - Muestra exactamente
monthrefundspendiente
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 Brian, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
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 |
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 |
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 |
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 doce meses verosímiles y está equivocada en más de $12,000. El fallo es una palabra.
Qué salió mal
UNION apila las dos fuentes y luego elimina las filas duplicadas. La CTE solo conserva dos columnas,
month y amount, así que dos reembolsos cualesquiera del mismo mes con el mismo monto se ven idénticos,
y uno de ellos desaparece. Solo en diciembre de 2025 hay seis devoluciones separadas reembolsadas a $20.99,
cuatro a $15.99 y cuatro a $159.00. Tras UNION, cada uno de esos grupos cuenta una vez.
Los números:
| filas en refund_lines | reembolsos de 2025 | |
|---|---|---|
UNION (starter) |
567 | $135,621.44 |
UNION ALL (solución) |
695 | $147,817.72 |
695 es exactamente 659 devoluciones de 2025 más 36 pedidos reembolsados con un cargo de envío. 567 no coincide con nada, y esa discrepancia es como se atrapa el fallo.
Cómo detectarlo
La comprobación fiable para cualquier consulta apilada es una conciliación de conteos de filas: cuenta cada fuente por separado, súmalas y compáralas con el conteo del resultado apilado.
SELECT COUNT(*) FROM returns
WHERE returned_on >= '2025-01-01' AND returned_on < '2026-01-01'; -- 659
Si el apilado tiene menos filas que la suma de sus partes, algo eliminó filas, y el UNION simple es el
primer sospechoso. El segundo sospechoso es una rama con un filtro que no pretendías.
Otro indicio: el starter estaría “bien” si cada reembolso tuviera un monto único. El fallo crece con el volumen, así que es peor en diciembre, el mes con más devoluciones, lo que hace que la historia estacional del informe se vea más tranquila de lo que fue.
La solución
Cambia UNION por UNION ALL. Nada más cambia: mismas columnas, mismos filtros, misma agregación. Si de
verdad necesitabas eliminar duplicados (por ejemplo el mismo reembolso exportado dos veces), hazlo sobre
una clave real como return_id, no sobre las columnas que la consulta casualmente seleccione.
Errores comunes
- Añadir DISTINCT para “limpiar” un apilado de montos. El mismo fallo, otra palabra clave.
- Arreglarlo añadiendo una columna aleatoria como
RANDOM()para que las filas difieran. UsaUNION ALLy conserva los ids si necesitas rastrear filas. - Conciliar solo el total. Compara también los conteos de filas: los totales pueden coincidir por accidente, los conteos rara vez.
En SQL Server
Comportamiento idéntico: UNION deduplica, UNION ALL no. El inicio de mes sería
DATEFROMPARTS(YEAR(returned_on), MONTH(returned_on), 1). En el plan de ejecución, un UNION simple
aparece como un paso extra de Distinct Sort o Hash Match, que es una forma rápida de notarlo en la
consulta de otra persona.
¡Linterna encendida!
Practicaste: unionunion alldebuggingrefunds
- Resuelto
- Sin pistas
- Al primer intento
