Paola Cristina Manzano Mora
Por favor explica la lógica de cada consulta, elabora casos para poder entender mejor el ejericio
Construir un reporte de ventas por país es exactamente lo que hace un analista de datos en su día a día. Aquí se integran todas las herramientas de SQL aprendidas —DDL, DML, SELECT, JOIN, GROUP BY, HAVING, ORDER BY y funciones de formato— en un solo ejercicio práctico que demuestra cómo transformar datos crudos en información útil para la toma de decisiones.
¿Cómo explorar los datos disponibles antes de construir el reporte?
Antes de lanzar cualquier consulta compleja, conviene saber con qué volumen de información se cuenta. Utilizando SELECT COUNT(*) sobre cada tabla se obtiene un panorama rápido [0:52]:
Esta exploración inicial confirma que hay información suficiente para generar reportes significativos. El COUNT(*) cuenta todas las filas de una tabla sin importar si hay valores nulos, lo que lo convierte en la forma más directa de medir el tamaño de cada entidad.
¿Qué muestra el reporte principal de ventas por país?
El reporte combina múltiples tablas mediante INNER JOIN, que devuelve únicamente los registros que tienen coincidencia en ambas tablas involucradas [1:30]. Se enlazan pedidos con sucursales, países y detalle de pedidos para obtener por cada país:
SUM(cantidad * precio_unitario).AVG(cantidad * precio_unitario).El resultado ya entrega valor analítico: Argentina, por ejemplo, muestra sus pedidos, clientes únicos, monto total y ticket promedio. Sin embargo, los números sin formato resultan difíciles de leer.
¿Cómo aplicar formato de moneda con TO_CHAR?
Para que el monto total y el ticket promedio sean legibles, se aplica la función TO_CHAR [2:45]. Esta función transforma valores numéricos en cadenas con formato específico, eliminando decimales innecesarios y presentando los datos como moneda. El resultado es un reporte mucho más presentable para quien lo visualice.
¿Se puede ampliar el reporte con más dimensiones?
Absolutamente. Se pueden agregar dimensiones como tiempo, sucursales o categoría de cliente para segmentar la información con mayor detalle.
¿Qué variantes prácticas se pueden construir sobre este reporte?
A partir del reporte base, se generan varias consultas que responden preguntas de negocio distintas.
Ventas por periodo de tiempo
Usando TO_CHAR sobre la fecha del pedido para extraer año y mes, se genera un campo de periodo [3:30]. Combinado con ORDER BY descendente y LIMIT 12, se obtienen los doce meses con mayor actividad comercial. Esto permite identificar estacionalidad y tendencias temporales en Tienda Latam.
Top diez productos más vendidos
Mediante INNER JOIN entre detalle de pedidos, productos y categorías, se listan los diez productos con mayor volumen de ventas [4:30]. Este tipo de consulta es fundamental para decisiones de inventario y estrategia comercial.
Categorías filtradas con HAVING
El HAVING actúa como un filtro que se aplica después de la agrupación, a diferencia del WHERE que filtra antes [5:08]. En este caso, se usa para mostrar solo las categorías de productos cuyas ventas superen diez mil unidades monetarias. El resultado revela que electrónica, deportes y outdoor, y ropa y calzado son las categorías que superan ese umbral.
Resumen con UNION ALL
UNION ALL permite unir los resultados de varias consultas independientes en una sola salida [5:55]. Cada consulta genera una fila con un indicador distinto:
Esto funciona como un dashboard resumido de los principales indicadores de Tienda Latam.
¿Cómo visualizar estos datos más allá de SQL?
Para gráficos simples, pgAdmin ofrece una herramienta básica. Cuando la complejidad aumenta, lo recomendable es conectar la base de datos PostgreSQL directamente a herramientas como Excel o Power BI [6:30]. Power BI, por ejemplo, permite crear visualizaciones interactivas que se alimentan de las mismas consultas construidas en SQL, transformando las tablas en gráficos dinámicos.
El desafío propuesto es claro: filtrar con HAVING solo países con más de diez mil en ventas totales, formatear con TO_CHAR incluyendo signo de pesos, y crear una variante agrupada por categoría de producto. Comparte ambas consultas en los comentarios, porque este es tu primer portafolio de SQL.
Paola Cristina Manzano Mora
Por favor explica la lógica de cada consulta, elabora casos para poder entender mejor el ejericio
William Serrano
No visualizo los recursos para visualización de datos. Yo busque los siguientes recursos en Platzi. Utilizando Power BI - https://platzi.com/cursos/powerbi/ - https://platzi.com/cursos/visualizacion-datos-bi/ También se podría utilizar Python con sus librerías de pandas y matplotlib.
Carlos Ivan De Jesus Mendoza
Excelente cursos para complementar lo que se aprendio de SQL
Wilmer Yesid Bautista Velandia
Les comparto la respuesta a los retos
Éxitos
José Eder Guzmán Mendoza
El reporte de ventas por país en TiendaLatam integra varios conceptos clave de SQL en un solo ejercicio práctico: SELECT, JOIN, GROUP BY, HAVING, ORDER BY y funciones de formato. Antes de construir el reporte, es importante explorar las tablas con COUNT(*) para conocer el volumen de datos disponible y validar que existe información suficiente para el análisis.
El reporte principal combina pedidos, sucursales, países y detalle de pedidos mediante INNER JOIN, permitiendo calcular indicadores como total de pedidos, clientes únicos, monto total de ventas y ticket promedio por país. Además, funciones como SUM, AVG y TO_CHAR ayudan a presentar los resultados de forma clara y legible, especialmente cuando se trabaja con valores monetarios.
A partir de este reporte base se pueden crear variantes útiles, como ventas por periodo, productos más vendidos, categorías con mayores ingresos mediante HAVING y resúmenes generales usando UNION ALL. En síntesis, este ejercicio demuestra cómo SQL permite transformar datos crudos en información estratégica para la toma de decisiones y constituye una excelente pieza inicial para un portafolio de análisis de datos.
Miguel Perez Rivera
Si, era eso, ahora he usado la formula ORDER BY SUM(dp.cantidad * dp.precio_unit) DESC; y ya funciona
Exacto. Al usar la función de agregación directamente, le devuelves al motor la capacidad de comparar los valores numéricos reales en lugar de caracteres. Es la diferencia entre comparar cantidades y comparar etiquetas.
Ahora que dominas el ordenamiento, ¿qué pasaría si quisieras mostrar solo los países que superan un monto total específico? ¿Qué cláusula usarías para filtrar después de haber sumado?
Wilmer Yesid Bautista Velandia
Saludos
Intento seguir el ejercicio que presenta el profe Walter alrededor del minuto 5:30 y luego le ajusto el formato de moneda... los resultados cambian bastante (cuando no deberían al ser sólo cuestión de formato), miren:
Ahora con formato de moneda aplicado...
Lo resalto ya que es de suma importancia tener claros los valores o magnitudes con las que estamos trabajando. En el caso didáctico del curso, no se aclaró el porqué el pgAdmin4 toma los valores de moneda con dos posiciones decimales que no están en los csv de apoyo.
OJO con eso en un entorno laboral!
Wilmer Yesid Bautista Velandia
Una pequeña precisión para el min 6:50 "Top 10 de productos más vendidos" generalmente se interpreta como los 10 productos con mayores CANTIDADES vendidas, mas no ingresos generados... no?
Si me aceptan esa "interpretación", haría un ajuste en la consulta, de esta manera...
Bienvenidos los comentarios siempre. Gracias.
Pablo Núñez
Me parece bien! order by unidades vendidas en vez de ingreso total.!
Javier Cano
Jhon Alexander Mosquera Vanegas
Lo que más rescato del proyecto integrador es el orden de trabajo: primero se cuentan las filas de cada tabla para saber cuántos datos hay, luego se construye un reporte base por país con pedidos, clientes únicos, ventas totales y ticket promedio, y solo después se derivan variantes por periodo, producto o categoría. Esa secuencia evita empezar por el informe más vistoso sin saber qué hay debajo. Para un análisis de presupuesto propondría copiarla tal cual: conteo de control, cifra base y desagregaciones, cada una verificable contra la anterior.
Juan Sebastián Martínez Medina
-- Variante por países
SELECT
pa.nombre_pais AS pais,
COUNT(DISTINCT p.pedido_id) AS total_pedidos,
COUNT(DISTINCT p.cliente_id) AS clientes_unicos,
TO_CHAR(SUM(dp.cantidad * dp.precio_unitario),
'FM$999,999,999.00') AS monto_total,
TO_CHAR(AVG(dp.cantidad * dp.precio_unitario),
'FM$999,999.00') AS ticket_promedio
FROM pedidos p
JOIN sucursales s ON p.sucursal_id = s.sucursal_id
JOIN paises pa ON s.pais_id = pa.pais_id
JOIN detalles_pedidos dp ON p.pedido_id = dp.pedido_id
GROUP BY pa.pais_id, pa.nombre_pais
HAVING SUM(dp.cantidad * dp.precio_unitario) > 10000
ORDER BY SUM(dp.cantidad * dp.precio_unitario) DESC;
-- Variante por categoría de productos
SELECT
c.nombre_categoria AS categorias,
COUNT(DISTINCT p.pedido_id) AS total_pedidos,
COUNT(DISTINCT p.cliente_id) AS clientes_unicos,
TO_CHAR(SUM(dp.cantidad * dp.precio_unitario),
'FM$999,999,999.00') AS monto_total,
TO_CHAR(AVG(dp.cantidad * dp.precio_unitario),
'FM$999,999.00') AS ticket_promedio
FROM pedidos p
JOIN sucursales s ON p.sucursal_id = s.sucursal_id
JOIN paises pa ON s.pais_id = pa.pais_id
JOIN detalles_pedidos dp ON p.pedido_id = dp.pedido_id
JOIN productos pro ON dp.producto_id = pro.producto_id
JOIN categorias c ON pro.categoria_id = c.categoria_id
GROUP BY c.nombre_categoria
HAVING SUM(dp.cantidad * dp.precio_unitario) > 10000
ORDER BY SUM(dp.cantidad * dp.precio_unitario) DESC;
Juan Quetglas Escarate
-- paises con mas de 10k $ en ventas
SELECT
pa.nombrepais AS pais,
COUNT(DISTINCT p.pedidoid) AS total_pedidos,
COUNT(DISTINCT p.clienteid) AS clientes_unicos,
TO_CHAR(SUM(dp.cantidad * dp.preciounitario),
'FM$999,999.00') AS monto_total,
TO_CHAR(AVG(dp.cantidad * dp.preciounitario),
'FM$999,999.00') AS ticket_promedio
FROM pedidos p
JOIN sucursales s ON p.sucursalid = s.sucursalid
JOIN paises pa ON s.paisid = pa.paisid
JOIN detalle_pedidos dp ON p.pedidoid = dp.pedidoid
GROUP BY pa.paisid, pa.nombrepais
having SUM(dp.cantidad * dp.preciounitario) > 10000
ORDER BY monto_total DESC;
-- categorias con mas de 10k $ en ventas
SELECT
COUNT(DISTINCT p.pedidoid) AS total_pedidos,
ca.categoriaid AS categoria_id,
ca.nombrecategoria as nombre_categoria,
TO_CHAR(SUM(dp.cantidad * dp.preciounitario),
'FM$999,999.00') AS monto_total
FROM detalle_pedidos dp
JOIN productos pr ON pr.productoid = dp.productoid
JOIN categorias ca ON ca.categoriaid = pr.categoriaid
JOIN pedidos p ON p.pedidoid = dp.pedidoid
GROUP BY ca.categoriaid
having SUM(dp.cantidad * dp.preciounitario) > 10000
ORDER BY monto_total DESC;
Jonathan Pederzini
Buen día!
Puede ser que la tabla de los 10 productos mas vendidos no sea así? está mostrando el monto de venta mas caro no los productos que más se vendieron más allá del precio.
Valeria Velasquez
-- ============================================================ -- REPORTE DE VENTAS POR PAÍS -- Países con más de $10.000 en ventas totales -- ============================================================ SELECT pa.nombre_pais AS pais, COUNT(DISTINCT p.pedido_id) AS total_pedidos, COUNT(DISTINCT p.cliente_id) AS clientes_unicos, TO_CHAR( AVG(dp.cantidad * dp.precio_unit), 'FM$999,999.00' ) AS ticket_promedio, TO_CHAR( SUM(dp.cantidad * dp.precio_unit), 'FM$999,999,999.00' ) AS monto_total FROM pedidos p JOIN sucursales s ON p.sucursal_id = s.sucursal_id JOIN paises pa ON s.pais_id = pa.pais_id JOIN detalle_pedidos dp ON p.pedido_id = dp.pedido_id GROUP BY pa.pais_id, pa.nombre_pais HAVING SUM(dp.cantidad * dp.precio_unit) > 10000 ORDER BY SUM(dp.cantidad * dp.precio_unit) DESC; -- ============================================================ -- REPORTE DE VENTAS POR CATEGORÍA -- Categorías con más de $10.000 en ventas totales -- ============================================================ SELECT ca.nombre_categoria AS categoria, COUNT(DISTINCT p.pedido_id) AS pedidos, SUM(dp.cantidad) AS unidades, TO_CHAR( SUM(dp.cantidad * dp.precio_unit), 'FM$999,999,999.00' ) AS monto_total FROM detalle_pedidos dp JOIN productos pr ON dp.producto_id = pr.producto_id JOIN categorias ca ON pr.categoria_id = ca.categoria_id JOIN pedidos p ON dp.pedido_id = p.pedido_id GROUP BY ca.categoria_id, ca.nombre_categoria HAVING SUM(dp.cantidad * dp.precio_unit) > 10000 ORDER BY SUM(dp.cantidad * dp.precio_unit) DESC;
Daniel Urango
Daniel Enrique Umaña Herrera
-- reporte de ventas por pais
SELECT
pa.nombre_pais AS pais,
COUNT(DISTINCT p.pedido_id) AS total_pedidos,
COUNT(DISTINCT p.cliente_id) AS clientes_unicos,
TO_CHAR(SUM(dp.cantidad * dp.precio_unitario), 'FM$999,999,999.00') AS monto_total,
AVG(dp.cantidad * dp.precio_unitario) AS ticket_promedio
FROM pedidos p
INNER JOIN sucursales s ON s.sucursal_id = p.sucursal_id
INNER JOIN paises pa ON pa.pais_id = s.pais_id
INNER JOIN detalles_pedidos dp ON dp.pedido_id = p.pedido_id
GROUP BY pa.nombre_pais
HAVING SUM(dp.cantidad * dp.precio_unitario) > 1000
ORDER BY total_pedidos DESC;
--reporte por categoria
SELECT
c.nombre_categoria AS category,
COUNT(DISTINCT p.pedido_id) AS pedidos,
SUM(dp.cantidad) AS unidades,
SUM(dp.cantidad * dp.precio_unitario) AS monto_total
FROM detalles_pedidos dp
INNER JOIN productos pr ON pr.producto_id = dp.producto_id
INNER JOIN categorias c ON c.categoria_id = pr.categoria_id
INNER JOIN pedidos p ON p.pedido_id = dp.pedido_id
GROUP BY c.nombre_categoria
HAVING SUM(dp.cantidad * dp.precio_unitario) > 10000
ORDER BY unidades DESC;
Guido Marquez
quiero complementar con la visualizacion de datos con Power Bi
¡Es el paso natural, Guido! Power BI se conecta directamente a tu base en PostgreSQL usando exactamente las mismas consultas SQL que construiste.
La clave está en llevar tus agregaciones y GROUP BY como tablas de consulta en el editor de Power Query, transformando datos estáticos en tableros interactivos para la empresa. ¿Te gustaría practicar una consulta específica para prepararla rumbo a Power BI?
Jorge Adonay Sánchez Ramírez
CARLOS ANDRES PILONIETA PINZON
David Josué Camperos Hernández
Mis soluciones:
-- Reporte por pais SELECT pa.nombre_pais AS pais, COUNT(DISTINCT p.pedido_id) AS total_pedidos, COUNT(DISTINCT p.cliente_id) AS clientes_unicos, TO_CHAR(SUM(dp.cantidad * dp.precio_unitario), '$FM999,999,999.99') AS monto_total, TO_CHAR(AVG(dp.cantidad * dp.precio_unitario), '$FM999,999,999.99') AS ticket_promedio FROM pedidos p JOIN sucursales s ON p.sucursal_id = s.sucursal_id JOIN paises pa ON s.pais_id = pa.pais_id JOIN detalle_pedidos dp ON p.pedido_id = dp.pedido_id GROUP BY pa.pais_id, pa.nombre_pais HAVING SUM(dp.cantidad * dp.precio_unitario) > 10000 ORDER BY SUM(dp.cantidad * dp.precio_unitario) DESC; -- Reporte por categoria de producto SELECT cat.nombre_categoria, COUNT(DISTINCT p.pedido_id) AS total_pedidos, COUNT(DISTINCT p.cliente_id) AS clientes_unicos, TO_CHAR(SUM(dp.cantidad * dp.precio_unitario), '$FM999,999,999.99') AS monto_total, TO_CHAR(AVG(dp.cantidad * dp.precio_unitario), '$FM999,999,999.99') AS ticket_promedio FROM pedidos p JOIN detalle_pedidos dp ON p.pedido_id = dp.pedido_id JOIN productos prd ON dp.producto_id = prd.producto_id JOIN categorias cat ON prd.categoria_id = cat.categoria_id GROUP BY cat.categoria_id, cat.nombre_categoria HAVING SUM(dp.cantidad * dp.precio_unitario) > 10000 ORDER BY SUM(dp.cantidad * dp.precio_unitario) DESC;
Tuve que repetir la expresión SUM(...) en el ORDER BY para obtener el orden correctamente.
Solución al reto de cierre de curso:
-- REPORTE 1: Ventas por país filtradas con HAVING (> $10,000) y formateadas con TO_CHAR. -- Relaciona pedidos, clientes y países, agrupa por nombre y muestra solo los mercados mayores a 10 mil. SELECT pa.nombre_pais AS "Pais", TO_CHAR(SUM(p.total), '$999,999,990.00') AS "Ventas totales" FROM pedidos as p INNER JOIN sucursales s ON s.sucursal_id = p.sucursal_id INNER JOIN paises pa ON pa.pais_id = s.pais_id GROUP BY pa.nombre_pais HAVING SUM(p.total) > 10000 ORDER BY "Ventas totales" DESC; -- REPORTE 2: Ventas por categoría de producto con la misma lógica de filtro y formato. -- Relaciona detalles de pedidos, productos y categorías, agrupa por categoría y filtra los mayores a 10 mil. SELECT ca.nombre_categoria AS "Categoría", TO_CHAR(SUM(dp.cantidad * dp.precio_unitario), '$999,999,990.00') AS "Ventas totales" FROM detalles_pedidos as dp INNER JOIN productos pr ON pr.producto_id = dp.producto_id INNER JOIN categorias ca ON ca.categoria_id = pr.categoria_id GROUP BY ca.nombre_categoria HAVING SUM(dp.cantidad * dp.precio_unitario) > 10000 ORDER BY "Ventas totales" DESC;
--- Desafio 1 -- Filtrar con having más de 10000$ en ventas SELECT pa.nombre_pais as paises, COUNT(DISTINCT p.cliente_id) AS clientes_unicos, COUNT(DISTINCT p.pedido_id) AS pedidos_unicos, TO_CHAR(SUM(dp.cantidad*dp.precio_unitario), 'FM$999,999.00') AS total_pedido, TO_CHAR(AVG(dp.cantidad*dp.precio_unitario), 'FM$999,999.00') AS ticket_promedio FROM pedidos p JOIN detalle_pedidos dp ON p.pedido_id = dp.pedido_id JOIN sucursales s ON p.sucursal_id = s.sucursal_id JOIN paises pa ON s.pais_id = pa.pais_id GROUP BY pa.pais_id, paises HAVING (SUM(dp.cantidad*dp.precio_unitario)) > 10000; --- Desafio 2 --- Filtrar por productos en vez de pais SELECT ca.nombre_categoria as categoria, COUNT(DISTINCT p.cliente_id) AS clientes_unicos, COUNT(DISTINCT p.pedido_id) AS pedidos_unicos, TO_CHAR(SUM(dp.cantidad*dp.precio_unitario), 'FM$999,999.00') AS total_pedido, TO_CHAR(AVG(dp.cantidad*dp.precio_unitario), 'FM$999,999.00') AS ticket_promedio FROM pedidos p INNER JOIN detalle_pedidos dp ON p.pedido_id = dp.pedido_id INNER JOIN productos pr ON dp.producto_id = pr.producto_id INNER JOIN categorias ca ON pr.categoria_id = ca.categoria_id GROUP BY categoria;
--Paso 1: Explorar los datos disponibles SELECT COUNT(*) AS total_pedidos FROM pedidos; SELECT COUNT(*) AS total_clientes FROM clientes; SELECT COUNT(*) AS total_productos FROM productos; SELECT COUNT(*) AS total_detalle FROM detalle_pedidos; --Paso 2: Ventas por pais SELECT pa.nombre AS pais, COUNT(DISTINCT p.pedido_id) AS total_pedidos, COUNT(DISTINCT p.cliente_id) AS clientes, TO_CHAR(SUM(dp.cantidad * dp.precio_unit), 'FM$999,999,999.00') AS monto_total, TO_CHAR(AVG(dp.cantidad * dp.precio_unit), 'FM999,999,999.00') AS ticket_promedio FROM pedidos p INNER JOIN sucursales s ON p.sucursal_id = s.sucursal_id INNER JOIN paises pa ON s.pais_id = pa.pais_id INNER JOIN detalle_pedidos dp ON p.pedido_id = dp.pedido_id GROUP BY pa.pais_id, pa.nombre ORDER BY monto_total DESC; --Variante 1: Reporte por mes (TOP 12 MESES) SELECT TO_CHAR(p.fecha, 'YYYY-MM') AS periodo, COUNT(DISTINCT p.pedido_id) AS pedidos, TO_CHAR(SUM(dp.cantidad * dp.precio_unit), 'FM$999,999,999.00') AS monto_total FROM pedidos p JOIN detalle_pedidos dp ON p.pedido_id = dp.pedido_id GROUP BY TO_CHAR(p.fecha, 'YYYY-MM') ORDER BY SUM(dp.cantidad * dp.precio_unit) DESC LIMIT 12; --Variante 2: Top 10 productos mas vendidos SELECT pr.producto_id, pr.nombre AS producto, ca.nombre AS categoria, SUM(dp.cantidad) AS unidades_vendidas, TO_CHAR(SUM(dp.cantidad * dp.precio_unit), 'FM$999,999,999.00') AS ingreso_total FROM detalle_pedidos dp INNER JOIN productos pr ON dp.producto_id = pr.producto_id INNER JOIN categorias ca ON pr.categoria_id = ca.categoria_id GROUP BY pr.producto_id, pr.nombre, ca.nombre ORDER BY SUM(dp.cantidad * dp.precio_unit) DESC LIMIT 10; --Variante 3: Reporte por categoria SELECT ca.nombre AS categoria, COUNT(DISTINCT p.pedido_id) AS pedidos, SUM(dp.cantidad) AS unidades, TO_CHAR(SUM(dp.cantidad * dp.precio_unit), 'FM$999,999,999.00') AS monto_total FROM detalle_pedidos dp JOIN productos pr ON dp.producto_id = pr.producto_id JOIN categorias ca ON pr.categoria_id = ca.categoria_id JOIN pedidos p ON dp.pedido_id = p.pedido_id GROUP BY ca.categoria_id, ca.nombre HAVING SUM(dp.cantidad * dp.precio_unit) > 10000 ORDER BY SUM(dp.cantidad * dp.precio_unit) DESC; --DASHBOARD FINAL DE TIENDA LATAM SELECT 'Paises activos' AS indicador, COUNT(DISTINCT pais_id)::TEXT AS valor FROM sucursales UNION ALL SELECT 'Sucursales', COUNT(*)::TEXT FROM sucursales UNION ALL SELECT 'Empleados', COUNT(*)::TEXT FROM empleados UNION ALL SELECT 'Clientes activos', COUNT(*)::TEXT FROM clientes WHERE activo = TRUE UNION ALL SELECT 'Productos', COUNT(*)::TEXT FROM productos UNION ALL SELECT 'Pedidos totales', COUNT(*)::TEXT FROM pedidos UNION ALL SELECT 'Lineas de detalle', COUNT(*)::TEXT FROM detalle_pedidos;
-- ================================================= -- TRABAJO FINAL - 1.FILTRAR CON HAVING PAISES CON VENTAS TOTALES >$10.000 -- ================================================== SELECT pa.nombrepais AS pais, COUNT(DISTINCT p.pedidoid) AS total_pedidos, COUNT(DISTINCT p.pedidoid) AS total_pedidos, TO_CHAR(SUM(dp.cantidad * dp.preciounitario),'FM$999,999,999.00') AS monto_total FROM pedidos p INNER JOIN sucursales s ON p.sucursalid = s.sucursalid INNER JOIN paises pa ON s.paisid = pa.paisid INNER JOIN detallepedidos dp ON p.pedidoid = dp.pedidoid GROUP BY pa.paisid, pa.nombrepais HAVING SUM(dp.cantidad * dp.preciounitario) >= 10000 ORDER BY monto_total DESC; -- ================================================= -- TRABAJO FINAL - 2. VARIANTE AGRUPADA POR CATEGORÍA Y NO POR PAIS -- ================================================== SELECT pr.categoriaid,cat.nombrecategoria, COUNT(DISTINCT p.pedidoid) AS total_pedidos, COUNT(DISTINCT p.pedidoid) AS total_pedidos, TO_CHAR(SUM(dp.cantidad * dp.preciounitario),'FM$999,999,999.00') AS monto_total FROM pedidos p INNER JOIN sucursales s ON p.sucursalid = s.sucursalid INNER JOIN paises pa ON s.paisid = pa.paisid INNER JOIN detallepedidos dp ON p.pedidoid = dp.pedidoid INNER JOIN productos pr ON dp.productoid = pr.productoid INNER JOIN categorias cat ON pr.categoriaid = cat.categoriaid GROUP BY pr.categoriaid,cat.nombrecategoria HAVING SUM(dp.cantidad * dp.preciounitario) >= 10000 ORDER BY SUM(dp.cantidad * dp.preciounitario) DESC;