La solicitud

De Brian Mitchell, Analista Financiero
Tu objetivo
Crea una tabla category_sales_2025 a partir de los pedidos completados realizados en 2025 (líneas con quantity > 0) con una fila por categoría: category, orders (pedidos distintos), units (suma de quantity) y net_revenue (suma de quantity * unit_price * (1 - discount_pct / 100.0), redondeada a 2). Luego consulta esa tabla y devuelve category, orders, units, net_revenue y revenue_per_order (net_revenue / orders, redondeado a 2), ordenado por net_revenue descendente.
- Lee de la tabla
productspendiente - Lee de la tabla
orderspendiente - Muestra exactamente
categoryordersunitsnet_revenuerevenue_per_orderpendiente
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 Brian, 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 |
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 |
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
Cuando la misma consulta costosa alimenta varios informes, guarda su resultado una vez y consulta la copia
guardada. CREATE TABLE ... AS SELECT, a menudo abreviado CTAS, hace exactamente eso.
CREATE TABLE AS SELECT
CREATE TABLE category_sales_2025 AS
SELECT p.category,
COUNT(DISTINCT o.order_id) AS orders,
SUM(i.quantity) AS units,
ROUND(SUM(i.quantity * i.unit_price * (1 - i.discount_pct / 100.0)), 2) AS net_revenue
FROM order_items AS i
JOIN orders AS o ON o.order_id = i.order_id
JOIN products AS p ON p.product_id = i.product_id
WHERE o.status = 'completed' AND i.quantity > 0
AND o.order_date >= '2025-01-01' AND o.order_date < '2026-01-01'
GROUP BY p.category;
No hay lista de columnas: la nueva tabla toma sus nombres de columna de los alias de la consulta y sus
tipos de las expresiones. Por eso los buenos alias importan aquí. Un SUM(...) sin nombre se convertiría
en una columna llamada algo como sum(i.quantity), que es un fastidio de escribir en cada consulta
posterior.
Consulta la tabla guardada
El resultado es una tabla normal con seis filas, una por categoría. Las consultas posteriores la leen como cualquier otra:
SELECT category, orders, units, net_revenue,
ROUND(net_revenue / orders, 2) AS revenue_per_order
FROM category_sales_2025
ORDER BY net_revenue DESC;
Furniture encabeza 2025 con $573,909.05 de 560 pedidos, así que un pedido de Furniture aporta unos $1,024.84 de ingresos de Furniture. Decor aparece en más pedidos (2,155) pero a $134.82 por pedido. Lighting queda en el medio con $385,144.61 de 1,221 pedidos.
Una tabla guardada es una instantánea. Si mañana se registra un reembolso, category_sales_2025 no
cambia hasta que la reconstruyas. Una vista (CREATE VIEW name AS SELECT ...) es la alternativa:
guarda la consulta, no las filas, así que siempre está al día pero se recalcula cada vez que la lees. Los
analistas usan tablas para instantáneas de informes diarios y vistas para la lógica que debe estar siempre
actualizada.
Tablas de preparación en la práctica
Los pipelines reales las encadenan: una tabla de preparación con las líneas de pedido limpias, una tabla de resumen construida a partir de ella, y un panel que lee el resumen. Cada paso es pequeño, tiene nombre y se puede comprobar por sí solo, la misma idea que una cadena de CTE, salvo que los resultados intermedios persisten.
En este juego cada ejecución se revierte, así que la tabla existe solo durante las sentencias de esa ejecución. Por eso la solución la crea y la consulta de una vez.
Errores comunes
- Falta el punto y coma entre las dos sentencias. La base de datos ve entonces una sola sentencia larga y rota.
- Dejar los agregados sin alias, de modo que las nuevas columnas reciben nombres generados incómodos.
- Ejecutar
CREATE TABLEdos veces en una base de datos real: la segunda vez falla porque la tabla ya existe. UsaCREATE OR REPLACE TABLE(DuckDB, Snowflake, BigQuery) o elimínala antes. - Olvidar que la tabla es una instantánea y presentar números desactualizados.
En SQL Server
T-SQL no tiene CREATE TABLE ... AS SELECT. Escribes SELECT ... INTO, que crea la tabla a partir de la
consulta:
SELECT Category, COUNT(*) AS Orders
INTO dbo.CategorySales2025
FROM ...;
Postgres, DuckDB, Snowflake y BigQuery usan CREATE TABLE ... AS; MySQL también lo acepta.
¡Linterna encendida!
Practicaste: create table asstaging tablectasaggregation
- Resuelto
- Sin pistas
- Al primer intento
