La solicitud

De Brian Mitchell, Analista de Finanzas
Tu objetivo
Desde order_items, considerando solo las filas con quantity > 0, devuelve una fila con: line_count (número de líneas), total_units (suma de quantity) y net_revenue (suma de quantity * unit_price * (1 - discount_pct / 100.0), redondeada a 2 decimales). Incluye todos los pedidos sin importar su estado.
- Lee de la tabla
order_itemspendiente - Muestra exactamente
line_counttotal_unitsnet_revenuependiente - 1 filapendiente
Tu consulta
Cargando el editor…
Solución de referencia
| order_item_id | order_id | product_id | quantity | unit_price |
|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 |
| 2 | 1001 | 154 | 3 | 11.99 |
| 3 | 1002 | 154 | 4 | 11.99 |
| 4 | 1002 | 194 | 1 | 149.00 |
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.
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 |
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 |
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
SUM, AVG, MIN y MAX funcionan como COUNT: colapsan filas en un solo valor. Reciben una
columna o cualquier expresión:
SELECT
SUM(quantity) AS total_units,
AVG(unit_price) AS avg_line_price,
MIN(unit_price) AS cheapest_line,
MAX(unit_price) AS priciest_line
FROM order_items;
Los ingresos se calculan por línea y luego se suman
En Harbor & Pine cada línea de pedido guarda la cantidad, el precio unitario al momento de la venta y un
descuento en porcentaje (15.0 significa 15 % de descuento). Los ingresos netos de una línea son:
quantity * unit_price * (1 - discount_pct / 100.0)
Dividir entre 100.0 en lugar de 100 es un hábito de portabilidad: si discount_pct fuera una columna
entera, Postgres calcularía 15 / 100 como 0 y descartaría todos los descuentos sin avisar.
Pon toda la expresión dentro de SUM. No multipliques sumas entre sí:
SUM(quantity) * SUM(unit_price) es un número sin sentido. La regla es calcular a nivel de fila,
agregar una sola vez.
Fíjate en que order_items.unit_price es el precio pagado, que puede diferir del
products.unit_price de hoy tras un cambio de precio. Los ingresos siempre usan el precio de la línea de pedido.
Excluir filas erróneas, en voz alta
Un puñado de líneas tiene cantidades cero o negativas. Brian pidió excluirlas, así que la consulta tiene
WHERE quantity > 0. En el trabajo, declara siempre las exclusiones en tu respuesta (“excluye 24 líneas con
quantity <= 0”). Cuando finanzas concilie tu número con el suyo, esa frase ahorra
una hora.
Cómo trata AVG los NULL
Como COUNT(columna), SUM, AVG, MIN y MAX ignoran los NULL. AVG(unit_cost) sobre productos es
el promedio de los costos conocidos. Normalmente es lo correcto, pero significa que
AVG(x) no siempre es SUM(x) / COUNT(*):
SELECT
AVG(unit_cost) AS avg_known_cost, -- ignores NULLs
SUM(unit_cost) / COUNT(*) AS treats_null_as_0 -- different number
FROM products;
Si todos los valores son NULL, SUM devuelve NULL, no 0. Envuélvelo en COALESCE(SUM(x), 0) cuando un informe
necesite un cero.
Promedios de promedios
Una trampa clásica: el valor promedio de pedido son los ingresos totales divididos entre el número de pedidos, no el
promedio de los ingresos por línea. Las líneas y los pedidos son granos distintos, y un promedio depende de sobre
cuál se promedia. Pregúntate siempre “¿una fila por qué?” antes de escribir AVG.
Errores comunes
- Redondear dentro de la suma:
SUM(ROUND(...))acumula errores de redondeo. Redondea el resultado final. - Usar
AVG(discount_pct)como “el descuento promedio”. Pondera igual una línea de $5 que una de $900. Un descuento ponderado por ingresos es100 * (1 - SUM(quantity * unit_price * (1 - discount_pct / 100.0)) / SUM(quantity * unit_price)).
En SQL Server
SUM, AVG, MIN y MAX ignoran los NULL de la misma manera. Ojo con AVG sobre una columna INT: devuelve un INT
allí, así que AVG(quantity) sobre las líneas limpias da 1 en lugar de 2.00 (el promedio real es 1.998). Convierte primero, y usa ISNULL o COALESCE para
los valores alternativos:
SELECT AVG(CAST(quantity AS decimal(10, 2))) AS avg_units
FROM order_items
WHERE quantity > 0; ¡Linterna encendida!
Practicaste: sumavgminmaxrevenue
- Resuelto
- Sin pistas
- Al primer intento
