Tablas esperadas (recomendado)

clientes(id_cliente, nombre, ciudad)
ventas(id_venta, id_cliente, fecha, total)
detalle_venta(id_detalle, id_venta, id_producto, cantidad, precio_unitario)
productos(id_producto, nombre, categoria, precio)

Si tu dataset no tiene detalle_venta, resuelve hasta donde aplique (1–12).

Nivel 1 – INNER JOIN (1–7)

1) Cliente + fecha + total de cada venta

Solución
SELECT c.nombre, v.fecha, v.total
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente;

2) Ventas mayores a 100 con nombre del cliente

Solución
SELECT c.nombre, v.fecha, v.total
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
WHERE v.total > 100;

3) Ventas ordenadas por fecha desc (incluye cliente)

Solución
SELECT c.nombre, v.fecha, v.total
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
ORDER BY v.fecha DESC;

4) Top 10 ventas por total (incluye cliente) – SQL Server

Solución
SELECT TOP 10 c.nombre, v.fecha, v.total
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
ORDER BY v.total DESC;

5) Clientes de una ciudad específica con sus ventas

Solución
SELECT c.nombre, c.ciudad, v.fecha, v.total
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
WHERE c.ciudad = 'Quito';

6) Total de ventas por cliente (JOIN + GROUP BY)

Solución
SELECT c.nombre, COUNT(v.id_venta) AS total_ventas
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
GROUP BY c.nombre
ORDER BY total_ventas DESC;

7) Monto total por cliente (SUM)

Solución
SELECT c.nombre, SUM(v.total) AS monto_total
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
GROUP BY c.nombre
ORDER BY monto_total DESC;

Nivel 2 – LEFT/RIGHT JOIN (8–12)

8) Todos los clientes y sus ventas (si existen) – LEFT JOIN

Solución
SELECT c.nombre, v.fecha, v.total
FROM clientes c
LEFT JOIN ventas v ON v.id_cliente = c.id_cliente
ORDER BY c.nombre;

9) Clientes sin ventas (LEFT JOIN + IS NULL)

Solución
SELECT c.id_cliente, c.nombre
FROM clientes c
LEFT JOIN ventas v ON v.id_cliente = c.id_cliente
WHERE v.id_venta IS NULL;

10) Ventas que no tienen cliente asociado (si existiera el caso)

Solución
SELECT v.id_venta, v.fecha, v.total
FROM ventas v
LEFT JOIN clientes c ON c.id_cliente = v.id_cliente
WHERE c.id_cliente IS NULL;

11) RIGHT JOIN equivalente a LEFT JOIN

Solución
-- RIGHT JOIN
SELECT c.nombre, v.fecha
FROM clientes c
RIGHT JOIN ventas v ON v.id_cliente = c.id_cliente;

-- Equivalente recomendado (LEFT)
SELECT c.nombre, v.fecha
FROM ventas v
LEFT JOIN clientes c ON c.id_cliente = v.id_cliente;

12) Clientes con ventas o sin ventas, mostrando 0 ventas (conteo)

Solución
SELECT c.nombre, COUNT(v.id_venta) AS total_ventas
FROM clientes c
LEFT JOIN ventas v ON v.id_cliente = c.id_cliente
GROUP BY c.nombre
ORDER BY total_ventas DESC;

Nivel 3 – JOIN múltiple (13–20)

Requiere detalle_venta y productos.

13) Detalle de ventas: cliente + producto + cantidad

Solución
SELECT c.nombre AS cliente, v.id_venta, p.nombre AS producto, dv.cantidad
FROM ventas v
INNER JOIN clientes c ON c.id_cliente = v.id_cliente
INNER JOIN detalle_venta dv ON dv.id_venta = v.id_venta
INNER JOIN productos p ON p.id_producto = dv.id_producto;

14) Total vendido por producto (SUM cantidad)

Solución
SELECT p.nombre AS producto, SUM(dv.cantidad) AS total_unidades
FROM detalle_venta dv
INNER JOIN productos p ON p.id_producto = dv.id_producto
GROUP BY p.nombre
ORDER BY total_unidades DESC;

15) Ingreso por producto (SUM cantidad*precio_unitario)

Solución
SELECT p.nombre AS producto,
       SUM(dv.cantidad * dv.precio_unitario) AS ingreso
FROM detalle_venta dv
INNER JOIN productos p ON p.id_producto = dv.id_producto
GROUP BY p.nombre
ORDER BY ingreso DESC;

16) Ingreso por categoría (JOIN + GROUP BY)

Solución
SELECT p.categoria,
       SUM(dv.cantidad * dv.precio_unitario) AS ingreso
FROM detalle_venta dv
INNER JOIN productos p ON p.id_producto = dv.id_producto
GROUP BY p.categoria
ORDER BY ingreso DESC;

17) Top 5 productos por ingreso (SQL Server TOP)

Solución
SELECT TOP 5 p.nombre AS producto,
       SUM(dv.cantidad * dv.precio_unitario) AS ingreso
FROM detalle_venta dv
INNER JOIN productos p ON p.id_producto = dv.id_producto
GROUP BY p.nombre
ORDER BY ingreso DESC;

18) Clientes con monto_total >= 500 (HAVING)

Solución
SELECT c.nombre AS cliente, SUM(v.total) AS monto_total
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
GROUP BY c.nombre
HAVING SUM(v.total) >= 500
ORDER BY monto_total DESC;

19) Clientes y total de productos comprados (SUM cantidad)

Solución
SELECT c.nombre AS cliente, SUM(dv.cantidad) AS unidades
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
INNER JOIN detalle_venta dv ON dv.id_venta = v.id_venta
GROUP BY c.nombre
ORDER BY unidades DESC;

20) Reporte final: cliente + monto_total + unidades, solo clientes con unidades >= 10

Solución
SELECT c.nombre AS cliente,
       SUM(v.total) AS monto_total,
       SUM(dv.cantidad) AS unidades
FROM clientes c
INNER JOIN ventas v ON v.id_cliente = c.id_cliente
INNER JOIN detalle_venta dv ON dv.id_venta = v.id_venta
GROUP BY c.nombre
HAVING SUM(dv.cantidad) >= 10
ORDER BY monto_total DESC;