La solicitud

De Priya Shah, Directora de Datos
Tu objetivo
Paso 1 de 3. Para los pedidos completados realizados en 2025, devuelve una fila por mes con: month (un DATE, el primero del mes), orders, net_revenue (redondeado a 2) y shipping_revenue (el shipping_fee de cada pedido contado una vez, redondeado a 2). Ordena por month ascendente.
- Lee de la tabla
orderspendiente - Lee de la tabla
order_itemspendiente - Muestra exactamente
monthordersnet_revenueshipping_revenuependiente
Paso 2 de 3. Para los pedidos de todos los estados realizados en 2025, devuelve una fila por canal con: channel, orders, cancelled_orders (pedidos con estado 'cancelled') y cancel_rate_pct (cancelled_orders / orders * 100, redondeado a 2).
- Lee de la tabla
orderspendiente - Muestra exactamente
channelorderscancelled_orderscancel_rate_pctpendiente - 3 filaspendiente
Paso 3 de 3. Entre los clientes con al menos un pedido completado en 2025, devuelve una fila por segmento (de customers) con: segment, buyers (clientes con al menos un pedido completado en 2025), repeat_buyers (los que tienen dos o más) y repeat_rate_pct (repeat_buyers / buyers * 100, redondeado a 1).
- Lee de la tabla
customerspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
segmentbuyersrepeat_buyersrepeat_rate_pctpendiente
Paso 1 · 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.
Paso 2 · 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.
Paso 3 · tu consulta
Cargando el editor…
Solución de referencia
| customer_id | first_name | last_name | city | |
|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Priya, 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 |
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 |
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 |
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 informes heredados rara vez tienen un solo fallo. Este desafío final te da tres consultas del mismo paquete. Cada una se ejecuta, cada una devuelve una tabla ordenada, y cada una le dice algo falso a la junta.
Paso 1: ingresos mensuales y envío
Dos fallos de este capítulo. El join con order_items repite el shipping_fee de cada pedido una vez por
línea, así que el envío está inflado en todos los meses: enero muestra $1,223.15 en lugar de $752.17. Y
BETWEEN '2025-01-01' AND '2025-12-31' se detiene a medianoche del 31 de diciembre, así que diciembre
tiene 623 pedidos en lugar de 634.
Arregla primero la multiplicación de filas sumando las líneas por pedido en una CTE. Luego cambia a un rango semiabierto. El conteo de pedidos, los ingresos y el total de envío deberían coincidir después con el sistema de pedidos.
Paso 2: tasa de cancelación por canal
El starter devuelve 12 filas para 3 canales. GROUP BY channel, status divide cada canal en una fila por
estado, así que la fila de cancelados muestra 100% y todas las demás 0%. Es un fallo de grano: la columna
extra hace el agrupamiento más fino que la pregunta.
Arregla el agrupamiento y aparece un segundo fallo: // es división entera, así que la tasa de app se
lee 6 en lugar de 6.23. Usa 100.0 * y divide con /.
Paso 3: tasa de recompra por segmento
Una tasa de recompra de exactamente 100% en ambos segmentos es imposible. El HAVING COUNT(*) >= 2
dentro de la CTE elimina a los compradores de una sola vez antes de que la consulta externa cuente
compradores, así que numerador y denominador son el mismo grupo. Es la lección de WHERE frente a HAVING en
otra forma: un filtro aplicado en el paso equivocado cambia lo que significa el agregado.
Quita el HAVING. El FILTER (WHERE b.orders >= 2) externo ya restringe el numerador. Empresas tiene 253
compradores y 188 recurrentes, consumidores 1,194 y 690.
Cómo trabajar un paquete roto
- Para cada consulta, di en una frase qué debería ser una fila de salida. Compáralo con el conteo de filas.
- Reconstruye un número desde la consulta más simple posible: el envío solo desde
orders, el conteo de diciembre con un rango semiabierto, los compradores con un simpleCOUNT(DISTINCT customer_id). - Arregla un fallo, vuelve a ejecutar, compara otra vez. Un segundo fallo suele esconderse detrás del primero.
Errores comunes
- Tratar el
COUNT(DISTINCT o.order_id)del paso 1 como prueba de que la consulta no tiene multiplicación de filas. Protege el conteo, no las sumas. - Arreglar la división del paso 2 pero no su agrupamiento: las filas de 0% y 100% siguen mal.
- Mover el
HAVINGdel paso 3 a la consulta externa: eso filtra segmentos, no clientes.
En SQL Server
T-SQL no tiene cláusula FILTER. Escribe los conteos condicionales con CASE, que también funciona en
DuckDB:
SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled_orders,
ROUND(100.0 * SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) / COUNT(*), 2)
En el trabajo
Anota qué estaba mal en cada consulta cuando devuelvas el paquete. La junta preguntará por qué cambiaron los números del trimestre pasado, y “el envío se contaba una vez por línea” es una respuesta que pueden aceptar.
¡Linterna encendida!
Practicaste: debuggingfan outbetweengraininteger divisionhaving
- Resuelto
- Sin pistas
- Al primer intento
