La solicitud

De Kevin Brooks, Gerente de Operaciones
Tu objetivo
Para los pedidos con status 'completed' hechos en 2025, devuelve una fila por canal con: channel, orders (todos esos pedidos), free_orders (shipping_fee = 0), standard_orders (shipping_fee mayor que 0 y menor que 10), express_orders (al menos 10 y menor que 40), freight_orders (40 o más) y free_pct (free_orders / orders * 100, redondeado a 1).
- Lee de la tabla
orderspendiente - Muestra exactamente
channelordersfree_ordersstandard_ordersexpress_ordersfreight_ordersfree_pctpendiente - 3 filaspendiente
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 Kevin, 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 |
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 |
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
Esta práctica combina dos herramientas del capítulo: CASE para clasificar filas en tramos y la agregación condicional para contar cada tramo en su propia columna.
Repaso: una columna por tramo
GROUP BY da una fila por grupo. Para obtener los tramos como columnas en lugar de filas adicionales, cuenta cada
condición por separado:
SELECT channel,
COUNT(*) AS orders,
COUNT(CASE WHEN coupon_code IS NOT NULL THEN 1 END) AS coupon_orders
FROM orders
WHERE status = 'completed'
AND order_date >= '2025-01-01'
AND order_date < '2026-01-01'
GROUP BY channel;
Para 2025 esto da web 256 pedidos con cupón de 1,761, app 277 de 1,904 y marketplace 84 de 630. Cada condición extra es una columna más, y la tabla se sigue leyendo una sola vez, por eso este patrón supera a escribir una consulta por tramo y pegar los resultados en una hoja de cálculo.
El CASE devuelve 1 para las filas que coinciden y NULL para el resto, así que COUNT cuenta solo las coincidencias. SUM(CASE WHEN ... THEN 1 ELSE 0 END) da el mismo número y también es común.
Las tarifas de envío de los pedidos de Harbor & Pine toman pocos valores: 0 cuando el pedido califica para envío gratis, 6.95 estándar, 14.95 exprés y 49.00 carga en web y app, mientras que los pedidos de marketplace llevan 4.99 o una tarifa con recargo (7.65, 16.45, 53.90). Usar rangos en el CASE, en lugar de valores exactos, coloca ambas listas de precios en los niveles correctos.
En 2025 el canal web tuvo 1,761 pedidos completados, 1,351 de ellos enviados gratis (76.7 %). Marketplace tuvo 630 y ninguno se envió gratis.
Errores comunes
- Huecos y solapamientos. Escribe los rangos con
>=en el límite inferior y<en el superior, para que cada tarifa caiga en exactamente un nivel. Una comprobación rápida: free + standard + express + freight debe ser igual a orders. - Porcentajes enteros. Multiplica primero por
100.0, para que la división conserve los decimales en todos los dialectos de SQL. - Contar el CASE con ELSE 0.
COUNT(CASE WHEN ... THEN 1 ELSE 0 END)cuenta todas las filas, porque 0 no es NULL. ConELSE 0, usa SUM.
En SQL Server
La agregación condicional funciona igual. La división entera es una trampa real allí:
100 * free_orders / orders con dos enteros se trunca a un número entero, así que conserva el 100.0.
¡Linterna encendida!
Practicaste: case whenconditional aggregationcountpercentage
- Resuelto
- Sin pistas
- Al primer intento
