Ir al contenido
wannacode

La panadería, etapa 3: las preguntas

En resumen: La etapa 3 responde a las preguntas de la panadería con JOIN, GROUP BY, LEFT JOIN, WITH y COALESCE: la carta, las cuentas, los más vendidos y los ingresos por ciudad.

Problema

Lo que quieren saber

La panadería tiene datos. Ahora quiere respuestas: qué poner en la carta, cuánto pagó cada cliente, de qué hornear más, a quién enviar un descuento, qué pedidos son grandes y de dónde viene el dinero.

Cada pregunta es una consulta a la base de la etapa 2. No se escribe nada: la base es la misma después de cada consulta.

La idea

Lo barato

La pregunta más sencilla va a una sola tabla: los productos de menos de 2 €, del más barato hacia arriba.

SQLbase de datos vacía

Pruébalo

La carta

Haz la carta: la categoría (columna category), el nombre y el precio de cada producto. Ordénala por categoría en el orden de sus números (pan, dulces, bebidas) y, dentro de la categoría, desde el producto más barato.

SQLbase de datos vacía

La idea

La cuenta

Cada línea del pedido cuesta quantity * unit_price. El pedido 5 de Desislava:

SQLbase de datos vacía

La suma del pedido es el total de estas líneas: SUM(quantity * unit_price) con GROUP BY el pedido.

Pruébalo

Las cuentas de todos

Para cada pedido que no esté cancelado: el número, el nombre del cliente, la fecha y la suma (columna total, redondeada a 2 decimales). Ordena por número.

SQLbase de datos vacía
Más precisamente, para curiosos

GROUP BY o.id, mientras que SELECT tiene c.name y o.ordered_at, que no están en el grupo. SQLite lo permite. PostgreSQL acepta o.ordered_at, porque la clave primaria de orders está en el grupo, pero no c.name, que es de otra tabla. Allí escribes GROUP BY o.id, c.name, y entonces la consulta funciona en todas partes.

Pruébalo

De qué hornear más

Los tres productos más vendidos por unidades, sin los pedidos cancelados: el nombre y la cantidad (columna pieces), empezando por el más vendido. Con unidades iguales, por nombre.

SQLbase de datos vacía

La idea

Quién no ha pedido

LEFT JOIN conserva a todos los clientes, incluso sin pedido. Ahí las columnas del pedido son NULL, y WHERE o.id IS NULL deja justo esos:

SQLbase de datos vacía

Pruébalo

Un descuento para los nuevos

La panadería envía un descuento a todos los que no tienen un pedido real: sin pedidos o solo con pedidos cancelados. Muestra sus nombres en orden alfabético.

SQLbase de datos vacía

Pruébalo

Los pedidos grandes

¿Qué pedidos (sin los cancelados) están por encima de la suma media por pedido? El número y la suma (total, redondeada a 2 decimales), por número. Calcula las sumas con WITH totals AS (…).

SQLbase de datos vacía

Ejercicio

De dónde viene el dinero

Los ingresos por ciudad de los pedidos que no están cancelados, para todas las ciudades de los clientes. Una ciudad sin ingresos tiene 0, y los clientes sin ciudad van bajo 'sin ciudad'. Columnas city y revenue (redondeada a 2 decimales), de mayor a menor ingreso.

SQLbase de datos vacía
Más precisamente, para curiosos

SUM sobre un grupo con solo NULL da NULL, no 0. Por eso se escribe COALESCE(SUM(…), 0). La suma de un pedido es un decimal, así que va con ROUND: 0,1 + 0,2 en REAL no es exactamente 0,3.

La idea

Lo que viene

Todas estas consultas solo leen. La siguiente etapa cambia los datos: precios, estados, existencias, pedidos borrados.

Test

Ponte a prueba

1. ¿Por qué la cuenta del pedido suma quantity * unit_price y no price de products?
2. LEFT JOIN orders o ON o.customer_id = c.id y después WHERE o.status <> 'cancelled'. ¿Qué pasa con los clientes sin pedidos?
3. La media por pedido es 9,40 €. ¿Por qué no escribir WHERE total > 9.4?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·