Hay que tener en cuenta que count(*) cuenta todas la filas y count(campo) no toma encuenta los campos con valores nulos al realizar la cuenta.
Introdución a las Bases de Datos
Todo lo que aprenderás sobre PostgreSQL para ciencia de datos
Importación de los datos para el proyecto
Breve historia de las bases de datos
Puntos fuertes de las bases de datos relacionales
Conceptos importantes de las bases de datos relacionales
Principales sentencias SQL
Ciencia de Datos
¿Qué es la ciencia de datos?
Aplicación de la ciencia de datos
Equipos orientados a datos
Data science vs. Machine Learning
Particularidades de PostgreSQL
Diferencias entre otros manejadores y PostgreSQL
Conoce los superpoderes de PLPGSQL
PLPGSQL: Stored procedures
PLPGSQL: conteo, registro y triggers
PLPGSQL: Aplicado a data science
Integración con otros lenguajes
Tipos de Datos Personalizados
Casos Prácticos
Explicación de la estructura de la base de datos de ejemplo
Agregación de datos
Pensando en la presentación
Trabajando con objetos
Agregando objetos
Common table expressions
Window functions
Particiones
Platzi movies dashboard
Presentación del proyecto
Top 10
Actualizando precios
Usando rank y percent rank
Ordenando datos geográficos
Datos en el tiempo
Visualizando datos con Tableau
Siguientes pasos
¿Qué sigue?
Compartu tu proyecto de Platzi Movies Dashboard y certifícate
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Israel Vázquez Morales
Aportes 173
Preguntas 0
Hay que tener en cuenta que count(*) cuenta todas la filas y count(campo) no toma encuenta los campos con valores nulos al realizar la cuenta.
Mínimo y máximo agrupado por la clasificación de películas:
Use el comando round() que aprendí en el curso de python, para indicar al precio promedio que solo desplegara 2 decimales
SELECT clasificacion, ROUND(AVG(precio_renta),2) AS precio_promedio
FROM peliculas
GROUP BY clasificacion
ORDER BY precio_promedio DESC;
Si tienen otra forma, compártanla !! 😃
A mi juicio, en esta clase empieza el curso…
Empezando con la hipótesis de que en ‘la ciudad donde haya más clientes, tendremos más ventas’.
Empezaría consultando clientes por ciudad.
SELECT ciudad,
COUNT(cliente_id) AS n
FROM clientes AS c
INNER JOIN direcciones AS d ON c.direccion_id = d.direccion_id
INNER JOIN ciudades AS ci ON d.ciudad_id = ci.ciudad_id
GROUP BY ciudad
ORDER BY n DESC
Tendríamos como resultado que Londres y Aurora deberían competir para cumplir con está hipótesis
SELECT ciudad,
SUM(precio_renta) AS ventas
FROM peliculas AS p
INNER JOIN inventarios AS i ON p.pelicula_id = i.pelicula_id
INNER JOIN rentas AS r ON i.inventario_id = r.inventario_id
INNER JOIN clientes AS c ON r.cliente_id = c.cliente_id
INNER JOIN direcciones AS d ON c.direccion_id = d.direccion_id
INNER JOIN ciudades AS ci ON d.ciudad_id = ci.ciudad_id
GROUP BY ciudad
ORDER BY ventas DESC;
Justamente sale Aurora como ganador pero eso no aprueba nuestra hipótesis porque Londres debería estar de segundo lugar o primero pero sale como apenas sexto, entonces podríamos llegar a la conclusión que deberíamos ver cuantas películas se rentaron por ciudad y a que precio.
¿Cuáles son los países que más películas rentan? Un recorrido visual de todas las tablas que se ven implicadas para obtener esta agregación.
mi hipotesis era poder ver cuales clientes eran los que mas habian rentado este es el Query y la imagen
SELECT CONCAT(c.nombre, ' ', c.apellido) AS nombre_completo, SUM(cantidad) AS pago_total
FROM clientes AS c
INNER JOIN pagos AS p
USING (cliente_id)
GROUP BY cliente_id
ORDER BY pago_total DESC
LIMIT 10;
Jugando con la tabla peliculas_actores saqué los 5 actores que actúan en más películas
SELECT actor_id, COUNT(pelicula_id) AS peliculas_totales
FROM peliculas_actores
GROUP BY actor_id
ORDER BY peliculas_totales DESC
LIMIT 5
Queries realizados
Para ver el total de películas en cada idioma.
SELECT l.nombre, COUNT(p.titulo) AS "Numero_Peliculas"
FROM lenguajes AS l
FULL OUTER JOIN peliculas AS p
ON l.lenguaje_id = p.lenguaje_id
GROUP BY l.nombre
Hice este query para saber cuantas rentas distintas se hicieron por mes.
SELECT date_trunc('month', fecha_renta) as mes, count(distinct(renta_id)) AS numero_rentas
FROM rentas
GROUP BY mes
ORDER BY numero_rentas DESC;
Asi ordene las peliculas por el minimo
select titulo, min(precio_renta)
from peliculas
group by titulo
order by min(precio_renta);
Practique con algunos queries y esto pude sacar, algo que deberia mejorar guys?
---Minimo y maximo precio de renta por clasificacion
SELECT clasificacion, MIN (precio_renta) AS Min_precio_renta, MAX(precio_renta) AS Max_precio_renta
FROM peliculas
GROUP BY clasificacion;
---Precio promedio de renta por clasificacion
SELECT clasificacion, ROUND (AVG (precio_renta),2) AS avg_renta
FROM peliculas
GROUP BY clasificacion
ORDER BY avg_renta DESC;
--Duracion promedio de renta por clasficacion
SELECT clasificacion, ROUND (AVG (duracion_renta),2) AS temps_renta
FROM peliculas
GROUP BY clasificacion
ORDER BY temps_renta;
---duracion pomedio (hour) por clasificacion
SELECT clasificacion, ROUND(AVG(duracion)/60,2)AS duracion_por_clasificacion_hour
FROM peliculas
GROUP BY clasificacion
ORDER BY duracion_por_clasificacion_hour;
--Duracion promedio de pelicula (minutos) por clasificacion
SELECT clasificacion, ROUND(AVG(duracion),2)AS duracion_por_clasificacion
FROM peliculas
GROUP BY clasificacion
ORDER BY duracion_por_clasificacion;
--Costo promedio de remplazo por titulo TOP 53
SELECT titulo, ROUND( AVG (costo_reemplazo),2) AS replacement_cost
FROM peliculas
GROUP BY titulo
ORDER BY replacement_cost DESC
LIMIT 53;
--- Costo promedio de reemplazo por clasificacion
SELECT clasificacion, ROUND (AVG(costo_reemplazo),2) AS replacement_cost
FROM peliculas
GROUP BY clasificacion
ORDER BY replacement_cost DESC;
--- Mayor duracion de renta por titulo
SELECT titulo, MAX (duracion_renta) AS Max_duracion_renta
FROM peliculas
GROUP BY titulo
ORDER BY Max_duracion_renta DESC;
--Duracion Max y Min de renta por clasificacion
SELECT clasificacion, MAX (duracion_renta) AS Max_duracion_renta, MIN (duracion_renta) AS Min_duracion_renta
FROM peliculas
GROUP BY clasificacion;
---total de peliculas por clasificacion
SELECT clasificacion, COUNT(*) AS total_movies_per_clasificacion
FROM peliculas
GROUP BY clasificacion
ORDER BY total_movies_per_clasificacion DESC;
Curioso no sabia que se podían hacer graficas
En todos los casos el precio menor por clasificacion es de $0.98
SELECT clasificacion, MIN(precio_renta) AS precio_renta_menor
FROM peliculas
GROUP BY clasificacion
ORDER BY precio_renta_menor DESC
La agregación de datos generalmente funciona en grandes bases de datos que no proporcionan mucho valor de información por sí solos. Los procesos clave de la agregación de datos son la recopilación, utilización y presentación de datos que están disponibles y presentes globalmente.
Se me ocurrio mirar cual era el empleado que mas ventas concretaba y me termine dando cuenta de que hay que echar a Dave, Erika y Edna, ya que no concretaron ninguna jaja.
Esta fue la query que utilice !
SELECT empleados.nombre, empleados.apellido, SUM(pagos.cantidad) AS total_ventas
FROM empleados
LEFT JOIN pagos
ON empleados.empleado_id = pagos.empleado_id
GROUP BY empleados.nombre, empleados.apellido
ORDER BY total_ventas DESC;
Mi Query: Clasificacion de Pelis favorita por Ciudad
SELECT ciudad, clasificacion
FROM (
SELECT ciudad, clasificacion, count(renta_id) AS cantidad_rentada, rank() over (partition By ciudad order by count(*) desc) as ranking_ciudad
FROM (
SELECT ci.ciudad, pe.titulo, pe.duracion, pe.clasificacion, r.renta_id FROM public.peliculas AS pe
INNER JOIN public.inventarios AS i ON pe.pelicula_id = i.pelicula_id
INNER JOIN public.rentas AS r ON i.inventario_id = r.inventario_id
INNER JOIN public.clientes AS c ON r.cliente_id = c.cliente_id
INNER JOIN public.direcciones AS d ON c.direccion_id = d.direccion_id
INNER JOIN public.ciudades AS ci ON d.ciudad_id = ci.ciudad_id) as Tabla_renta_por_ciudad
GROUP BY ciudad, clasificacion
ORDER by cantidad_rentada DESC) AS Tabla_final
WHERE ranking_ciudad = 1;
NOTA: Si puedes simplificarlo me enseñas como?
Pensé que podría ser útil saber cuantos empleados hay por tienda, para saber así qué tienda tiene más empleados y qué además están activos. El query sería así:
SELECT tienda_id, activo, COUNT(*) AS conteo_empleados
FROM empleados
GROUP BY tienda_id, activo
ORDER BY conteo_empleados DESC;
Top 10 de más películas por nombre y apellido de los actors
SELECT actores.nombre, actores.apellido, peliculas_actores.actor_id,
COUNT(peliculas_actores.pelicula_id) AS peliculas_totales
FROM actores, peliculas_actores
WHERE actores.actor_id = peliculas_actores.actor_id
GROUP BY actores.nombre,actores.apellido, peliculas_actores.actor_id
ORDER BY peliculas_totales DESC
LIMIT 10;
Para controles de inventarios y predicdciones de ventas asi como de compras para controles del stock vs ventas y proyeccion de las mismas
-- precio maximo y min por peliculas
SELECT titulo, MAX(precio_renta), MIN(precio_renta)
FROM peliculas
GROUP BY titulo;
SELECT CONCAT(clientes.nombre, ' ', clientes.apellido) AS cliente,
SUM(cantidad) AS cantidad_pagada,
COUNT(inventario_id) AS cantidad_peliculas_rentadas
FROM clientes
INNER JOIN pagos ON clientes.cliente_id = pagos.cliente_id
INNER JOIN rentas ON clientes.cliente_id = rentas.cliente_id
GROUP BY cliente
ORDER BY cantidad_pagada DESC, cantidad_peliculas_rentadas DESC;
-- Utilizando la funcion MAX y MIN en nuetro proyecto
SELECT MAX (precio_renta)
FROM peliculas;
SELECT MIN (precio_renta)
FROM peliculas;
-- Sacando el maximo y minimo de renta con el titulo de la pelicula
SELECT titulo, MAX (precio_renta)
FROM peliculas
GROUP BY titulo;
SELECT titulo, MIN (precio_renta)
FROM peliculas
GROUP BY titulo;
SELECT
t.tienda_id,
t.jefe_tienda_id,
t.direccion_id,
COUNT(r.renta_id) AS total_rentas
FROM
public.tiendas t
JOIN
public.empleados e ON t.tienda_id = e.tienda_id
JOIN
public.inventarios i ON t.tienda_id = i.tienda_id
JOIN
public.rentas r ON i.inventario_id = r.inventario_id
GROUP BY
t.tienda_id, t.jefe_tienda_id, t.direccion_id
ORDER BY
total_rentas DESC;
Se realiza una unión (JOIN) entre las tablas tiendas, empleadosy rentaspara obtener la información necesaria. Luego, se utiliza la función de agregación COUNTpara contar el número total de alquileres por cada tienda. La consulta finalmente agrupa por la identificación de la tienda ( tienda_id), el jefe de tienda ( jefe_tienda_id) y la dirección ( direccion_id).
-- Reto / traer informacion de una de la tablas que no sea peliculas
-- Total de clientes registrados
SELECT COUNT(*)
FROM clientes;
-- Total de clientes activos
SELECT COUNT(cliente_id)
FROM clientes
WHERE activo IS TRUE;
-- Cantidad de clientes por pais ordenados
SELECT pais, count(cliente_id) AS cantidad_de_clientes_por_pais
FROM clientes AS cli
INNER JOIN direcciones AS dir ON cli.direccion_id = dir.direccion_id
INNER JOIN ciudades AS ciu ON ciu.ciudad_id = dir.ciudad_id
INNER JOIN paises AS p ON p.pais_id = ciu.pais_id
GROUP BY p.pais_id
ORDER BY cantidad_de_clientes_por_pais DESC
-- Cantidad de clientes por ciudad en el pais con mas clientes
SELECT ciudad, count(cliente_id) AS cantidad_de_clientes_por_ciudad
FROM clientes AS cli
INNER JOIN direcciones AS dir ON cli.direccion_id = dir.direccion_id
INNER JOIN ciudades AS ciu ON ciu.ciudad_id = dir.ciudad_id
INNER JOIN paises AS p ON p.pais_id = ciu.pais_id
WHERE p.pais = 'India'
GROUP BY ciu.ciudad
ORDER BY ciu.ciudad DESC
Este query muestra el conteo de clasificacion ordenado de manera descendente:
SELECT clasificacion, COUNT(*) AS conteo
FROM peliculas
GROUP BY clasificacion
ORDER BY conteo DESC;
SELECT titulo, MIN(precio_renta)
FROM peliculas
GROUP BY titulo;
Promedio del costo de remplazar una película dependiendo de su categoría
select clasificacion, count (*), avg (costo_reemplazo) as costo_reemplazo_promedio
from peliculas
group by clasificacion
order by costo_reemplazo_promedio;
Sí aplicamos este código conoceremos el precio promedio por cada clasificación
select clasificacion, count (*), avg (precio_renta)
from peliculas
group by clasificacion
Lenguaje que mas aparace
SELECT nombre, SUM(lenguaje_id) AS mas_usado
FROM lenguajes
GROUP BY nombre
ORDER BY mas_usado DESC;
--- ACTORES QUE MAS SE REPITEN
SELECT nombre, COUNT(*) AS repeticiones
FROM actores
GROUP BY nombre
ORDER BY repeticiones DESC
LIMIT 10;
<SELECT titulo, MIN(precio_renta)
FROM peliculas
GROUP BY titulo
ORDER BY titulo ASC;>
Computes the maximum of the non-null input values. Available for any numeric, string, date/time, or enum type, as well as inet, interval, money, oid, pg_lsn, tid, xid8, and arrays of any of these types.
Minimo
SELECT titulo, MIN(precio_renta)
FROM peliculas
GROUP BY titulo;
Use todo lo que enseño el profesor en la clase en este codigo
SELECT clasificacion, MAX(duracion), MIN(duracion), AVG(precio_renta)
FROM public.peliculas
GROUP BY clasificacion
ORDER BY avg desc;
👉Recordatorio:
Una pregunta basica de entrevistas es cuales son las funciones de agregacion y como se aplican. Tomen nota de esta clase, porque es util que sepan que estas son SUM, AVG, MAX, MIN, entre otras
Como ordenar el minimo
SELECT titulo, MIN(precio_renta)
FROM peliculas
GROUP BY titulo
ORDER BY MIN ASC;
Los 10 clientes que mas han pagado en rentas.
SELECT CONCAT(c.nombre,' ', c.apellido) AS "Soy el cliente", CONCAT ('$', SUM(p.cantidad), ' dolares') AS "he pagado"
FROM pagos AS p
INNER JOIN clientes AS c
ON p.cliente_id = c.cliente_id
GROUP BY c.nombre, c.apellido
ORDER BY "he pagado" DESC
LIMIT 10;
Desde el punto de vista del negocio serian interesantes:
Consulta de ingresos generados por las rentas de películas.
Consulta de películas más populares por género
Consulta de películas más rentadas por período de tiempo.
SELECT titulo, MAX(precio_renta)
FROM peliculas
GROUP BY titulo;
SELECT titulo, MIN(precio_renta)
FROM peliculas
GROUP BY titulo;
SELECT MIN(precio_renta)
FROM peliculas
;
SELECT SUM(precio_renta)
FROM peliculas;
SELECT clasificacion, COUNT(*)
FROM peliculas
GROUP BY clasificacion;
SELECT AVG(precio_renta)
FROM peliculas;
SELECT clasificacion, AVG(precio_renta) AS precio_promedio
FROM peliculas
GROUP BY clasificacion
ORDER BY precio_promedio DESC;
SELECT clasificacion, AVG(duracion) AS duracion_promedio
FROM peliculas
GROUP BY clasificacion
ORDER BY duracion_promedio DESC;
SELECT clasificacion, AVG(duracion_renta) AS duracion_renta_promedio
FROM peliculas
GROUP BY clasificacion
ORDER BY duracion_renta_promedio DESC;
tablas clientes y pagos, podemos encontrar el numero de veces que los clientes han rentado y a que precio
SELECT
c.cliente_id, CONCAT (c.nombre, ’ ', c.apellido) as cliente,
p.cantidad,
p.fecha_pago
from clientes as c
left join pagos as p
on c.cliente_id = p.cliente_id
Comparto codigo para encontrar los 5 clientes que mas han rentado peliculas con la respectiva tienda a la que estan vinculados.
SELECT nombre, apellido, tienda_id, SUM(cantidad) AS cantidad_pago_total
FROM clientes c, pagos p
WHERE c.cliente_id = p.cliente_id
GROUP BY nombre, apellido, tienda_id
ORDER BY cantidad_pago_total DESC
LIMIT 5;
Realicé el MAX para duración y así luego compararlo con la duración en la renta y ver si tenia que ver con la demora al devolver la pelicula, pero observando los resultados no tienen nada que ver estos tiempos.
SELECT clasificacion, MAX(duracion) AS mas_larga, duracion_renta
FROM peliculas
GROUP BY clasificacion, duracion_renta
ORDER BY duracion_renta DESC;
SELECT SUM (lenguaje_id) FROM peliculas;
Comparto algunos quieres para responder algunas preguntas de un comentario más abajo 😃
/* número de películas que están en inglés */
SELECT l.nombre, COUNT(1) as conteo
FROM peliculas p,
lenguajes l
WHERE p.lenguaje_id = l.lenguaje_id
GROUP BY l.nombre;
/* Top 5 clientes que más rentaron peliculas */
SELECT c.cliente_id, c.nombre, c.apellido, SUM(p.cantidad) AS gasto_en_renta
FROM clientes c,
rentas r,
pagos p
WHERE r.cliente_id = c.cliente_id
AND p.cliente_id = r.cliente_id
AND p.renta_id = r.renta_id
GROUP BY c.cliente_id, c.nombre, c.apellido
ORDER BY gasto_en_renta DESC
LIMIT 5;
/
/* Top 5 actores que han participado en más peliculas */
SELECT a.nombre||' '||a.apellido as nombre_actor, COUNT(1) as conteo
FROM peliculas_actores p,
actores a
WHERE p.actor_id = a.actor_id
GROUP BY a.nombre||' '||a.apellido
ORDER BY conteo DESC
LIMIT 5;
/
Solucion al problema
SELECT MIN(precio_renta)
FROM peliculas;
SELECT titulo,MIN(precio_renta)
FROM peliculas
GROUP BY titulo;
Aqui les dejo algunas d elas queries intetresantes que logre sacar!
--Películas por tienda
SELECT tienda_id, COUNT(DISTINCT pelicula_id)
FROM inventarios
GROUP BY tienda_id
ORDER BY tienda_id ASC;
--Ventas por empleado
SELECT empleado_id, SUM (cantidad) AS ventas_por_empleado
FROM pagos
GROUP BY empleado_id
ORDER BY ventas_por_empleado DESC;
--Total Compras por cliente
SELECT cliente_id, SUM (cantidad) AS compras_por_cliente
FROM pagos
GROUP BY cliente_id
ORDER BY compras_por_cliente DESC;
--Rentas por cliente
SELECT cliente_id, COUNT(DISTINCT inventario_id) AS total_rentas
FROM rentas
GROUP BY cliente_id
ORDER BY total_rentas DESC;
seguramente habran muchas mas pero esas fueron als que se me ocurrienrona primera vista 😄 seria genial ver cuales crearon tambein ustedes
Me pregunté cual era la pelicula que más se rentó y si habian peliculas que nunca se habian rentado. Alguien más se lo preguntó o que me puedar feedback de los queries
-- Cual es la pelicula más rentada? Listado de peliculas rentadas
SELECT peliculas.pelicula_id, titulo, COUNT(rentas.inventario_id) AS conteo
FROM rentas JOIN inventarios
ON rentas.inventario_id = inventarios.inventario_id
JOIN peliculas
ON peliculas.pelicula_id = inventarios.pelicula_id
GROUP BY titulo,peliculas.pelicula_id
ORDER BY conteo DESC;
-- Existen peliculas que no se han rentado nunca?
SELECT inventarios.pelicula_id, titulo, peliculas.pelicula_id
FROM inventarios RIGHT JOIN peliculas
ON inventarios.pelicula_id = peliculas.pelicula_id
WHERE inventarios.pelicula_id IS NULL
GROUP BY titulo, inventarios.pelicula_id, peliculas.pelicula_id
;
SELECT MIN (precio_renta)
FROM peliculas
GROUP BY titulo;
SELECT MIN (precio_renta)
FROM peliculas;
Mi aporte es un query con las peliculas mas rentadas y ordenada por mayores ingresos
-- PELICULAS MAS RENTADAS Y SUS VENTAS
SELECT *, round(rentas_acumuladas,0) * precio as ventas
FROM (
SELECT peliculas.pelicula_id, peliculas.titulo, string_agg(DISTINCT CONCAT(actores.nombre, ' ', actores.apellido), ',') as nombes_actores , count(*) AS rentas_acumuladas, round(AVG(peliculas.precio_renta),2) as precio
FROM rentas
-- RELACIONA RENTAS CON INVENTARIOS
JOIN inventarios ON rentas.inventario_id = inventarios.inventario_id
-- RELACION PELICULAS CON NO. INVENTARIO (RENTAS NO TIENE EL ID PELICULA)
JOIN peliculas on inventarios.pelicula_id = peliculas.pelicula_id
-- RELACIONA PELICULAS CON ACTORES_PELICULAS
JOIN peliculas_actores ON peliculas.pelicula_id = peliculas_actores.pelicula_id
-- RELACIONA ACTORES_PELICULAS CON ACTORES
JOIN actores ON actores.actor_id = peliculas_actores.actor_id
GROUP BY peliculas.pelicula_id
) AS resultado
ORDER BY ventas DESC;
SELECT titulo, MIN(precio_renta)
FROM peliculas
GROUP BY titulo;
Hice este query para determinar cuáles son los 10 clientes que más han gastado en rentas.
SELECT SUM(cantidad) AS total_comprado_por_cliente,
clientes.cliente_id,
clientes.nombre,
clientes.apellido
FROM pagos LEFT JOIN clientes
ON clientes.cliente_id = pagos.cliente_id
GROUP BY clientes.cliente_id
ORDER BY total_comprado_por_cliente DESC
LIMIT 10;
Mi aporte a la comunidad, aquí un panorama por apariciones de actores desglosado por clasificación parental.
-- Consulta Actores por número de películas actuadas, desglosados por clasificación parental.
SELECT (nombre || ' ' || apellido) AS nombres, clasificacion AS clfc, COUNT(tab_pa.pelicula_id) AS actuadas
FROM actores AS tab_act
JOIN peliculas_actores AS tab_pa ON tab_act.actor_id = tab_pa.actor_id
JOIN peliculas AS tab_pel ON tab_pa.pelicula_id = tab_pel.pelicula_id
GROUP BY nombres, clasificacion
ORDER BY nombres, actuadas
LIMIT 50; -- Se puede quitar el comando sí se quiere ver la totalidad de los actores.
SELECT cliente_id, SUM(cantidad) AS suma_cantidad
FROM pagos
GROUP BY cliente_id
ORDER BY suma_cantidad DESC;
Selecciona a los clientes por la suma de cantidad de pagos realizados.
Ordenándolos de mayor a menor importes
Los clientes que más han gastado
SELECT cliente_id, SUM(cantidad) AS total_gastado
FROM pagos
GROUP BY cliente_id
ORDER BY total_gastado DESC
LIMIT 5
La cantidad de peliculas que hizo cada actor,un punto a recalcar, es que tenemos que unir nombre y apellido,ya que, hay actores que tienen igual nombre, por lo tanto ,al momento de hacer el conteo, va haber un error, porque se puede pensar que ese actor hizo 100 peliculas y en realidad es la suma del numero de peliculas de actores diferente, pero que tienen mismo nombre.
Select concat (A.nombre,' ',A.apellido) as "Nombre_completo", count(B.actor_id) as "Cantidad de peliculas"
from actores A inner join
peliculas_actores B on A.actor_id=B.actor_id
group by "Nombre_completo"
order by "Cantidad de peliculas" DESC;
top 10 de clientes que mas han rentado películas
select id, nombre, apellido, n_rentas
from(
select cliente_id as id, count(*) as n_rentas
from rentas
group by cliente_id) as n_renta
left join clientes on n_renta.id=clientes.cliente_id
order by n_rentas desc
limit 10;
quería saber cual tienda era responsable de mas ventas, y descubrí que es la tienda numero 2 con este script
WITH pagos_tienda as (
SELECT *
FROM empleados
INNER JOIN pagos USING (empleado_id)
INNER JOIN tiendas USING (tienda_id)
)
SELECT SUM(cantidad) as total_sells,tienda_id --paste empleados, tiendas y pagos
FROM pagos_tienda
GROUP BY tienda_id
ORDER BY total_sells DESC
Quise buscar cuales eran las tiendas con mas ventas
select tiendas.tienda_id, count(*) as numero_de_ventas
from rentas
inner join empleados on rentas.empleado_id = empleados.empleado_id
inner join tiendas on empleados.tienda_id = tiendas.tienda_id
group by tiendas.tienda_id
order by numero_de_ventas desc;
Al percatarme de que eran muy pocas tiendas fui a revisar otras tablas y descubrí que solo dos tiendas tienen empleados
select empleados.empleado_id , tiendas.tienda_id
from empleados full outer join tiendas
on empleados.tienda_id= tiendas.tienda_id;
Ahora quise buscar las ciudades con más tiendas
select ciudades.ciudad, count(*)
from tiendas
inner join direcciones on tiendas.direccion_id= direcciones.direccion_id
inner join ciudades on direcciones.ciudad_id= ciudades.ciudad_id
group by ciudad
;
y encontré que había una por ciudad
Así que para unir mis consultas fui a ver en que ciudades estaban mis tiendas que si tienen empleados
select ciudades.ciudad, tiendas.tienda_id
from tiendas
inner join direcciones on tiendas.direccion_id= direcciones.direccion_id
inner join ciudades on direcciones.ciudad_id= ciudades.ciudad_id
order by tiendas.tienda_id
;
aqui mi aporte para saber que pais tiene mas rentas de peliculas de forma descendente
SELECT COUNT(*), pa.pais
FROM rentas r INNER JOIN clientes c
ON r.cliente_id = c.cliente_id
INNER JOIN direcciones d ON c.direccion_id = d.direccion_id
INNER JOIN ciudades ci ON d.ciudad_id = ci.ciudad_id
INNER JOIN paises pa ON ci.pais_id = pa.pais_id
GROUP BY pa.pais
ORDER BY COUNT DESC
La o las mas caras con todos sus datos:
SELECT *
FROM peliculas
WHERE precio_renta > (SELECT MAX(precio_renta) FROM peliculas);
El precio máximo y mínimo de venta
SELECT titulo,
MAX(precio_renta) AS precio_mayor,
MIN(precio_renta) AS precio_menor
FROM peliculas
GROUP BY titulo;
Top 10 de clientes que mas rentan:
SELECT CONCAT(nombre, ' ', apellido) AS nombre, clientes_que_mas_rentan.conteo
FROM ( SELECT cliente_id, COUNT(cliente_id) AS conteo
FROM rentas
GROUP BY cliente_id
ORDER BY conteo DESC
LIMIT 10 ) AS clientes_que_mas_rentan
INNER JOIN clientes ON
clientes_que_mas_rentan.cliente_id = clientes.cliente_id
ORDER BY clientes_que_mas_rentan.conteo DESC
UNA CONSULTA PARA DETERMINAR EL NUMERO PELICULAS EN INGLÉS.
SELECT COUNT(*)
FROM (
SELECT p.titulo as titulo,
l.nombre as lenguaje
FROM peliculas as p
INNER JOIN lenguajes as l
ON p.lenguaje_id = l.lenguaje_id
WHERE l.nombre = 'English') AS tabla_nueva
;
```sql
-- CLIENTES CON MAS RENTAS
SELECT concat(a.nombre, ' ', a.apellido) nombre_completo, count(*) as counterin
FROM pagos as p
JOIN clientes as a on p.cliente_id = a.cliente_id
GROUP by nombre_completo
ORDER by counterin desc
limit 5;
-- TOP CLIENTS WHO PAY MORE FOR RENT
SELECT concat(a.nombre, ' ', a.apellido) nombre_completo, sum(cantidad) as suma
FROM pagos as p
JOIN clientes as a on p.cliente_id = a.cliente_id
GROUP by nombre_completo
order by suma desc
limit 5;
-- TOP EARNING MONTHS
SELECT count(extract(month from fecha_pago)), extract(month from fecha_pago) as mes
FROM pagos as p
JOIN clientes as a on p.cliente_id = a.cliente_id
group by mes;
SELECT to_char(fecha_pago, 'Month') as ax, count(*)
FROM pagos
GROUP by ax
ORDER by count desc;
-- TOP employees with most rents
SELECT concat(e.nombre, ' ', e.apellido) as empl, count(*)
FROM pagos as p
JOIN clientes as a on p.cliente_id = a.cliente_id
JOIN empleados as e on p.empleado_id = e.empleado_id
group by empl;
SELECT * FROM pagos;
-- TOP PLACES WITH MOST RENTS
SELECT t.tienda_id, count(*), t.jefe_tienda_id
FROM rentas as r
join inventarios as i on r.inventario_id = i.inventario_id
join tiendas as t on t.tienda_id = i.tienda_id
join empleados as e on e.empleado_id = t.jefe_tienda_id
GROUP by t.tienda_id, t.jefe_tienda_id
order by count desc
limit 5;
-- TOP BOSSES WITH MOST RENTS
SELECT t.tienda_id, count(*), concat(e.nombre, ' ',e.apellido) as nombre_jefe
FROM rentas as r
join inventarios as i on r.inventario_id = i.inventario_id
join tiendas as t on t.tienda_id = i.tienda_id
join empleados as e on e.empleado_id = t.jefe_tienda_id
GROUP by t.tienda_id, nombre_jefe
order by count desc
-- limit 5;
-- NOMBRE DE LOS JEFES DE TIENDAS QUE NO TIENEN EMPLEADOS
select nombre, apellido
from empleados
where empleado_id in (SELECT jefe_tienda_id
FROM empleados as e
RIGHT join tiendas as t on e.tienda_id = t.tienda_id
-- AND t.jefe_tienda_id = e.empleado_id
-- join tiendas as t on t.jefe_tienda_id = e.empleado_id
WHERE e.tienda_id is null);
-- TOP MOVIE CATEGORIES
SELECT c.nombre as catego, count(*)
FROM categorias as c
join peliculas_categorias as pc on pc.categoria_id = c.categoria_id
join peliculas as p on p.pelicula_id = pc.pelicula_id
join inventarios as i on i.pelicula_id = p.pelicula_id
join rentas as r on r.inventario_id = i.inventario_id
GROUP by catego
order by count desc
-- TOP MOVIES
SELECT P.TITULO as movie, count(*)
FROM categorias as c
join peliculas_categorias as pc on pc.categoria_id = c.categoria_id
join peliculas as p on p.pelicula_id = pc.pelicula_id
join inventarios as i on i.pelicula_id = p.pelicula_id
join rentas as r on r.inventario_id = i.inventario_id
GROUP by movie
order by count desc
-- TOP 10 MOVIES W/ CATEGORIES
SELECT P.TITULO as titulo, c.nombre as catego, count(*) as conteo
FROM categorias as c
join peliculas_categorias as pc on pc.categoria_id = c.categoria_id
join peliculas as p on p.pelicula_id = pc.pelicula_id
join inventarios as i on i.pelicula_id = p.pelicula_id
join rentas as r on r.inventario_id = i.inventario_id
GROUP by titulo, catego
order by conteo desc
limit 10;
-- TOP 10 MOVIES WITH THE HIGHEST EARNINGS
SELECT P.TITULO as movie, c.nombre, sum(pa.cantidad) as cantidad
FROM categorias as c
join peliculas_categorias as pc on pc.categoria_id = c.categoria_id
join peliculas as p on p.pelicula_id = pc.pelicula_id
join inventarios as i on i.pelicula_id = p.pelicula_id
join rentas as r on r.inventario_id = i.inventario_id
JOIN pagos as pa on pa.renta_id = r.renta_id
GROUP by movie, c.nombre
order by cantidad desc
LIMIT 10
-- TOP 10 CATEGORIES WITH THE HIGHEST EARNINGS
SELECT c.nombre categoria, sum(pa.cantidad) as cantidad
FROM categorias as c
join peliculas_categorias as pc on pc.categoria_id = c.categoria_id
join peliculas as p on p.pelicula_id = pc.pelicula_id
join inventarios as i on i.pelicula_id = p.pelicula_id
join rentas as r on r.inventario_id = i.inventario_id
JOIN pagos as pa on pa.renta_id = r.renta_id
GROUP by categoria
order by cantidad desc
LIMIT 10
-- EMPLOYEES WITH THE HIGHEST EARNINGS
SELECT concat(e.nombre, ' ' ,e.apellido) as nombre_completo, sum(pa.cantidad) as cantidad
FROM categorias as c
join peliculas_categorias as pc on pc.categoria_id = c.categoria_id
join peliculas as p on p.pelicula_id = pc.pelicula_id
join inventarios as i on i.pelicula_id = p.pelicula_id
join rentas as r on r.inventario_id = i.inventario_id
JOIN pagos as pa on pa.renta_id = r.renta_id
JOIN empleados as e on e.empleado_id = pa.empleado_id
GROUP by nombre_completo
order by cantidad desc
-- TOP STORES WITH THE HIGHEST EARNING
SELECT t.tienda_id as store, sum(pa.cantidad) as cantidad
FROM categorias as c
join peliculas_categorias as pc on pc.categoria_id = c.categoria_id
join peliculas as p on p.pelicula_id = pc.pelicula_id
join inventarios as i on i.pelicula_id = p.pelicula_id
join rentas as r on r.inventario_id = i.inventario_id
JOIN pagos as pa on pa.renta_id = r.renta_id
JOIN empleados as e on e.empleado_id = pa.empleado_id
JOIN tiendas as t on t.tienda_id = i.tienda_id
GROUP by store
order by cantidad desc
Para ese caso solo cambiamos la funcion MAX por MIN y corremos el Query
Promedio de empleados activos en tiendas
SELECT activo, AVG(tienda_id) AS activos_tienda_promedio
FROM empleados
GROUP BY activo
ORDER BY activos_tienda_promedio DESC;
Mi query de minimo
SELECT MIN(precio_renta)
FROM peliculas;
SELECT titulo, MIN(precio_renta)
FROM peliculas
GROUP BY titulo;
Para obtener el top 10 de peliculas mas baratas para alquilar
SELECT titulo, MIN(precio_renta) AS minimo FROM peliculas
GROUP BY titulo
ORDER BY minimo ASC
LIMIT 10;
Precio MIN de renta de Peliculas.
SELECT clasificacion, MIN(precio_renta)
FROM peliculas
GROUP BY 1;
-- Pago máximo
SELECT MAX(cantidad)
FROM pagos;
-- Pago minimo
SELECT MIN(cantidad)
FROM pagos;
-- Pago máximo por cliente
SELECT cliente_id, MAX(cantidad) AS pago_maximo_cliente
FROM pagos
GROUP BY cliente_id;
-- Pago minimo por cliente
SELECT cliente_id, MIN(cantidad) AS pago_minimo_cliente
FROM pagos
GROUP BY cliente_id;
-- Promedio de pagos
SELECT AVG(cantidad) AS promedio_pagos
FROM pagos;
-- Promedio de pagos por cliente
SELECT cliente_id,AVG(cantidad) AS promedio_pagos
FROM pagos
GROUP BY cliente_id
ORDER BY promedio_pagos DESC;
Existen 3 nombres de actores que se repiten 4 veces cada uno.
select nombre, count( *)as cantidad
from actores
group by nombre
order by cantidad DESC ;
--Mínimo precio de renta de la lista de películas.
SELECT MIN(precio_renta)
FROM peliculas;
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?