Está en la página 1de 13

Ejercicio 9 - Unidad 4

Base de datos

1
Base de datos
Ejercicio 9

Índice

Añade encabezados (Formato > Estilos de párrafo) y aparecerán en el índice.

Página: 2/13
Base de datos
Ejercicio 9

1.- Producto cartesiano de la tabla sanciones con la tabla conductores.


458.832 filas.

SELECT *
FROM Sanciones CROSS JOIN Conductores;

1.1.- Producto cartesiano de la tabla conductores consigo misma.


234.256 filas.

SELECT *
FROM Conductores CROSS JOIN Conductores AS Conductores_2;

2.- Consulta que nos muestre el nombre del policía, apellidos del policía, identificación del
vehículo, fecha y Sanción de las multas que han puesto los policías, cuyo primer apellido
comienza por las letras comprendidas entre las letras “A” y “F”.
357 filas.

SELECT p.Nombre, p.Apellidos, s.id_vehiculo, s.fecha, s.Sancion


FROM Policias AS P INNER JOIN Sanciones AS S ON p.id_policia=s.id_policia
WHERE p.Apellidos LIKE '[a-f]%';

Página: 3/13
Base de datos
Ejercicio 9

2.1.- Hacer la misma combinación anterior pero de forma que aparezcan todos los registros
de la tabla policía hayan puesto multa o no.
358 filas.

SELECT *
FROM Policias AS P LEFT JOIN Sanciones AS S ON p.id_policia=s.id_policia
WHERE p.Apellidos LIKE '[a-f]%';

3.- Consulta que nos muestre de la tabla sanciones, los campos del id_vehiculo y la sanción
impuesta y de la tabla vehículos la matrícula del vehículo, el id_propietario y el precio del
vehículo. Poner primero la tabla Sanciones y luego la tabla Vehículos y usar la opción
RIGHT JOIN.
1012 filas.

Página: 4/13
Base de datos
Ejercicio 9

SELECT
sanciones.id_vehiculo,sanciones.sancion,vehiculos.matricula,vehiculos.id_propietario,vehicu
los.precio
FROM sanciones RIGHT JOIN vehiculos ON sanciones.id_vehiculo = vehiculos.id_vehiculo

3.1.- Si intercambiamos las tablas ¿por qué se muestran menos filas en el resultado?

La consulta con las tablas intercambiadas muestra menos filas porque solo devuelve los
registros de la tabla vehiculos que tienen un registro correspondiente en la tabla sanciones.

4.- Consulta que nos muestre el nombre y los apellidos de los conductores en una misma
columna y en otra campo el nombre del país, de aquellos registros cuyo nombre de país
comience por la letra "A" o por la "B". Hacer que en el resultado aparezcan todos los
nombres de los países que comienzan por esas letras tengan o no conductores asociados.
471 filas.

SELECT c.Nombre, c.Apellidos, p.Pais


FROM Conductores AS C RIGHT JOIN Paises AS P ON c.id_pais=p.id_pais
WHERE p.Pais LIKE 'A%' OR p.Pais LIKE 'B%';

Página: 5/13
Base de datos
Ejercicio 9

5.- En una consulta indicar mediante la función de agregado correspondiente ¿cuántas


sanciones se han puesto en total?
948 SANCIONES.

SELECT COUNT(id_sancion) AS Total_Sancion


FROM Sanciones;

5.1.- En una consulta indicar ¿cuántos valores distintos de multas se han puesto en total?
Por ejemplo, si tenemos sanciones por valor de 30, 45, 30, 56, 23, 45, 30. El resultado seria
4 importes de multas distintos.
476 SANCIONES.

SELECT DISTINCT Sancion


FROM Sanciones;

Página: 6/13
Base de datos
Ejercicio 9

6.- Consulta en la que se nos muestre el valor más alto que se ha puesto de una multa, el
valor más pequeño, la suma total de dinero recaudado y el valor medio de multa que se ha
puesto a todos los conductores cuyo nombre de país de procedencia no comienza por las
letras “A” , "B" o la “P”.
SELECT
MAX(Sancion) AS multa_mas_alta,
MIN(Sancion) AS multa_mas_baja,
SUM(Sancion) AS recaudado_total,
AVG(Sancion) AS multa_media
FROM dbo.Conductores
INNER JOIN dbo.Paises ON dbo.Conductores.id_pais = dbo.Paises.id_pais
INNER JOIN dbo.Vehiculos ON dbo.Conductores.id_conductor =
dbo.Vehiculos.id_propietario
INNER JOIN dbo.Sanciones ON dbo.Vehiculos.id_vehiculo = dbo.Sanciones.id_vehiculo
WHERE Paises.pais NOT LIKE 'A%'
AND Paises.pais NOT LIKE 'B%'
AND Paises.pais NOT LIKE 'P%';

7.- Consulta en la que se nos muestre el nombre y apellidos de los policías, juntos en una
misma columna y en la otra columna la suma total de las sanciones que le han puesto,
ordenadas en orden descendente de la suma de las sanciones.

SELECT p.Nombre+SPACE(1)+p.Apellidos AS Nombre_Completo, SUM(s.Sancion) AS


SUMA
FROM Policias AS P INNER JOIN Sanciones AS S ON p.id_policia=s.id_policia
GROUP BY p.Nombre+SPACE(1)+p.Apellidos
ORDER BY SUMA DESC;

Página: 7/13
Base de datos
Ejercicio 9

7.1.- ¿Se podría usar LEFT o RIGHT en el JOIN en la consulta anterior? ¿Qué diferencia
habría entre las dos?

Página: 8/13
Base de datos
Ejercicio 9

Al utilizar LEFT o RIGHT aparece el policía que no ha puesto ninguna multa.

8.- Consulta en la que se nos muestre los distintos modelos de los vehículos que tenemos
en la base de datos y luego una columna con la suma de las sanciones impuestas a ese
modelo, otra columna con la sanción máxima de las sanciones que han tenido cada
modelo, y otra con la sanción mínima. Ordenados en orden descendente de la suma de las
sanciones.

SELECT Modelos.modelo,SUM(sanciones.Sancion) AS
suma_sanciones,MAX(sanciones.Sancion) AS multa_maxima,MIN(sanciones.Sancion) AS
multa_minima
FROM dbo.Vehiculos INNER JOIN dbo.Sanciones ON dbo.Vehiculos.id_vehiculo =
dbo.Sanciones.id_vehiculo INNER JOIN dbo.Modelos ON dbo.Vehiculos.id_modelo =
dbo.Modelos.id_modelo
GROUP BY
Modelos.modelo
ORDER BY
suma_sanciones DESC

9.- Consulta en la que se nos muestre de cada modelo y categoría la media total de
sanciones que ha tenido. Y que solamente se nos muestren los datos de aquellas en las
que la media es superior a 300 euros.
Utiliza la función CAST para mostrar la media con dos decimales.
17 filas.

Página: 9/13
Base de datos
Ejercicio 9

10.- Consulta en la que se nos muestre agrupados por el nombre del mes la suma total de
sanciones que se han puesto por cada mes. Ordenados alfabéticamente por el nombre del
mes. Y que se nos muestren sólo los meses cuya suma de sanciones son superiores a
20000 euros.
10 filas.

SELECT DATENAME(mm, fecha) AS Nombre_Mes, SUM(Sancion) AS Suma_Sancion_Mes


FROM Sanciones
GROUP BY DATENAME(mm, fecha)
HAVING SUM(Sancion) > 20000
ORDER BY Nombre_Mes

Página: 10/13
Base de datos
Ejercicio 9

10.1.- Modificar la consulta anterior para que nos muestre el mismo resultado pero
ordenado por los meses pero de la forma que vienen ordenados en los años naturales:
enero, febrero, marzo….. ¿que solución podría buscar?

SELECT DATENAME(mm, fecha) AS Nombre_Mes, SUM(Sancion) AS Suma_Sancion_Mes


FROM Sanciones
GROUP BY DATENAME(mm, fecha), MONTH(fecha)
HAVING SUM(Sancion) > 20000
ORDER BY MONTH(fecha)

Página: 11/13
Base de datos
Ejercicio 9

11.- Consulta en la que se nos muestre agrupados por el número de año la media de
sanciones de cada año y que sólo se nos muestren los años en los que la media de las
sanciones es superior a 305 euros. Ordenar el resultado por número de año en orden
ascendente.
4 filas.

SELECT YEAR(fecha) AS Año, AVG(Sancion) AS Media_Sancion


FROM Sanciones
GROUP BY YEAR(fecha)
HAVING AVG(Sancion) > 305
ORDER BY YEAR(fecha);

o con cast para decimales:

SELECT YEAR(Fecha) AS Año, CAST(AVG(Sancion) AS decimal(38,2)) AS


MediaSanciones
FROM Sanciones
GROUP BY YEAR(Fecha)
HAVING AVG(Sancion) > 305
ORDER BY Año ASC;

Página: 12/13
Base de datos
Ejercicio 9

Realizado por: Para:

Página: 13/13

También podría gustarte