Nivel 1 · Productos por rango de precio
¿Es nuevo para ti? Lee primero el concepto: Calcular un valor nuevo para cada fila
0 de 3
La solicitud

De Jessica Turner, Gerente de Merchandising
Tu objetivo
Desde products, devuelve price_band y products (número de productos), una fila por rango. price_band es 'under_50' cuando unit_price < 50, '50_to_199' cuando unit_price es al menos 50 y menor de 200, y '200_plus' cuando unit_price es 200 o más.
- Lee de la tabla
productspendiente - Muestra exactamente
price_bandproductspendiente - 3 filaspendiente
Tu consulta
Cargando el editor…
Solución de referencia
| product_id | name | category | subcategory | unit_price |
|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Jessica, y por qué
Tablas
Datos de la tienda Harbor & Pine, listos para consultar.
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 |
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 |
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 |
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
CASE es el if/else de SQL. Devuelve un valor según condiciones:
CASE
WHEN unit_price < 50 THEN 'under_50'
WHEN unit_price < 200 THEN '50_to_199'
ELSE '200_plus'
END
Puede ir en cualquier lugar donde vaya una expresión: en SELECT, WHERE, ORDER BY, GROUP BY, o dentro de un agregado.
Las ramas se revisan en orden
La primera rama verdadera gana y las demás se omiten. Por eso la segunda rama puede decir simplemente
unit_price < 200: un producto de $30 ya coincidió con la primera rama y nunca llega a ella. Ordena tus
ramas desde el límite más específico o más bajo hasta el más alto. Si las invirtieras y revisaras
< 200 primero, todo producto barato caería en 50_to_199.
Sé preciso con los límites. Un producto de exactamente $50.00 debe ir a exactamente un rango. Con límites <
revisados en orden ascendente, cada valor cae en exactamente un tramo sin huecos.
ELSE y NULL
Si ninguna rama coincide y no hay ELSE, CASE devuelve NULL. Aquí todo producto tiene precio, así que
ELSE '200_plus' es seguro. Cuando una columna puede ser NULL, manéjala explícitamente primero, o cae en
el tramo del ELSE y lo infla:
CASE
WHEN unit_cost IS NULL THEN 'unknown'
WHEN unit_cost < 20 THEN 'low'
ELSE 'high'
END
Agrupar por un CASE
Necesitas la misma expresión en GROUP BY. Repetir todo el CASE es legal pero ruidoso, así que los analistas
suelen escribir GROUP BY 1 (la primera columna del select) o el alias:
SELECT
CASE WHEN unit_price < 50 THEN 'under_50'
WHEN unit_price < 200 THEN '50_to_199'
ELSE '200_plus' END AS price_band,
COUNT(*) AS products
FROM products
GROUP BY price_band;
Agrupar por un alias funciona en DuckDB, Postgres, MySQL y BigQuery. SQL Server exige la expresión completa.
Ordenar los tramos de forma sensata
Las etiquetas de texto se ordenan alfabéticamente: 200_plus va antes que 50_to_199. Para mostrar los rangos del más barato al
más caro, ordena por un segundo CASE o por MIN(unit_price):
ORDER BY MIN(unit_price)
CASE simple
También hay una forma corta que compara una expresión con valores:
CASE channel WHEN 'web' THEN 'Website' WHEN 'app' THEN 'Mobile app' ELSE 'Partner' END
Solo maneja igualdad, y CASE col WHEN NULL nunca coincide, por la misma razón por la que = NULL nunca
coincide.
Errores comunes
- Condiciones solapadas en el orden equivocado, como arriba.
- Mezclar tipos entre ramas, como
THEN 'low'yTHEN 0. Todas las ramas deben devolver el mismo tipo, o la base de datos da error (o convierte de formas sorprendentes).
En SQL Server
CASE es idéntico. SQL Server también tiene IIF(unit_price < 50, 'under_50', 'other'), un atajo para un
CASE con un WHEN y un ELSE; anida CASE en lugar de IIF cuando hay más de dos resultados.
¡Linterna encendida!
Practicaste: case whenbucketinggroup by
- Resuelto
- Sin pistas
- Al primer intento
