Nivel 1 · Acumulado del año que se reinicia cada enero
0 de 3
La solicitud

De Laura Bennett, Directora de Finanzas
Tu objetivo
Usando pedidos completados y líneas con quantity > 0, devuelve una fila por mes para todos los meses de los datos con: month (primer día del mes, como DATE), net_revenue (suma de quantity * unit_price * (1 - discount_pct / 100.0), redondeada a 2), ytd_revenue (total acumulado de los ingresos netos desde enero del mismo año hasta ese mes, redondeado a 2) y cumulative_revenue (total acumulado desde el primer mes de los datos hasta ese mes, redondeado a 2). Ordena por month ascendente.
- Lee de la tabla
orderspendiente - Lee de la tabla
order_itemspendiente - Muestra exactamente
monthnet_revenueytd_revenuecumulative_revenuependiente
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 Laura, 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
Un total acumulado responde “¿cuánto llevamos?”. Finanzas rara vez quiere “lo que llevamos en toda la historia”, sin embargo. Quiere “lo que llevamos este año”, que empieza en cero cada enero. Eso es una cláusula más.
Dos totales acumulados, una diferencia
Ya viste SUM(...) OVER (ORDER BY month) en el capítulo de funciones de ventana: con un ORDER BY dentro
de OVER, cada fila suma todas las filas hasta ella misma, incluida. Añade PARTITION BY y la suma se
reinicia en cada partición:
SUM(net_revenue) OVER (PARTITION BY YEAR(month) ORDER BY month) AS ytd_revenue,
SUM(net_revenue) OVER (ORDER BY month) AS cumulative_revenue
YEAR(month) es 2023, 2024 o 2025, así que las 36 filas mensuales caen en tres ventanas de doce. La
partición no tiene que ser una columna de la salida. Cualquier expresión sirve.
Ejemplo resuelto: el cambio de año
Con pedidos completados y líneas con cantidad positiva, las filas alrededor de enero de 2024 se ven así:
| month | net_revenue | ytd_revenue | cumulative_revenue |
|---|---|---|---|
| 2023-12-01 | 241,527.32 | 1,600,531.40 | 1,600,531.40 |
| 2024-01-01 | 109,305.64 | 109,305.64 | 1,709,837.04 |
| 2024-02-01 | 77,546.58 | 186,852.21 | 1,787,383.61 |
El acumulado del año de diciembre de 2023 es el total completo de 2023. Enero de 2024 empieza de nuevo, mientras la columna de por vida continúa. En diciembre de 2025 el total de por vida es $5,896,296.81 y el acumulado del año 2025 es $2,301,690.14.
Leer el acumulado del año
El acumulado del año es más útil frente al mismo punto del año pasado. A finales de junio, 2025 estaba en $1,026,835.51 frente a $789,588.04 de 2024, cerca de un 30% por delante. Ten cuidado al extrapolar medio año a un año completo en Harbor & Pine: noviembre y diciembre por sí solos aportaron el 25% de los ingresos de 2025, así que una tienda que está “a la mitad” en junio no está a la mitad de su cifra anual.
Primero agrega, luego la ventana
Las funciones de ventana se ejecutan después de GROUP BY. Suma las líneas de pedido a meses en una CTE y
luego ejecuta la ventana sobre 36 filas. Escribir SUM(SUM(...)) OVER (...) en una sola consulta también
funciona, pero la CTE es más fácil de leer y de comprobar.
Errores comunes
- Particionar por lo que no es.
PARTITION BY monthda a cada fila su propia ventana, así que el total acumulado es igual al valor mensual. - Olvidar el ORDER BY dentro de OVER.
SUM(net_revenue) OVER (PARTITION BY YEAR(month))devuelve el total del año completo en cada fila, no uno acumulado. - Huecos en los meses. Un total acumulado sobre un mes sin ventas simplemente se salta ese mes. Aquí todos los meses tienen ventas; con datos dispersos, construye primero un calendario.
En SQL Server
No hay DATE_TRUNC antes de SQL Server 2022 (DATETRUNC(month, order_date) en 2022+). Usa
DATEFROMPARTS(YEAR(order_date), MONTH(order_date), 1). Añade también un marco explícito: el valor por
defecto es RANGE, que es más lento y trata las fechas empatadas como un solo paso.
SUM(net_revenue) OVER (PARTITION BY YEAR(month) ORDER BY month
ROWS UNBOUNDED PRECEDING) AS ytd_revenue ¡Linterna encendida!
Practicaste: running totalpartition bysum overyear to datecte
- Resuelto
- Sin pistas
- Al primer intento
