Cuestiones SQL para Base de Datos de Empresa de Telefonía

1. Creación de la tabla TELEFONOS

Crea la siguiente tabla en la base de datos: TELEFONOS (IMEI, MARCA, MODELO, FECHA, PRECIO).

CREATE TABLE TELEFONOS (
    IMEI VARCHAR(20) PRIMARY KEY,
    MARCA VARCHAR(30) NOT NULL,
    MODELO VARCHAR(40) NOT NULL,
    FECHA DATE NOT NULL,
    PRECIO DECIMAL(8,2) NOT NULL
);

2. Añadir el campo COLOR a la tabla TELEFONOS

Añade a la tabla anterior el campo COLOR para indicar el color del aparato.

ALTER TABLE TELEFONOS
ADD COLOR VARCHAR(15) NULL;

3. Inserción de registros en la tabla TELEFONOS

Inserta dos registros en la tabla TELEFONOS.

INSERT INTO TELEFONOS (IMEI, MARCA, MODELO, FECHA, PRECIO, COLOR)
VALUES ('1234567890', 'SAMSUNG', 'GALAXY 21', '2024-03-06', 455.60, 'ROJO');

INSERT INTO TELEFONOS (IMEI, MARCA, MODELO, FECHA, PRECIO, COLOR)
VALUES ('1234567891', 'SAMSUNG', 'GALAXY 22', '2024-03-06', 605.60, NULL);

4. Borrar llamadas de números de Prepago

Borra las llamadas que realizaron los números de Prepago el último trimestre del año pasado.

Nota: Aplicar SET AUTOCOMMIT=0; antes y SET AUTOCOMMIT=1; después de la operación.

-- SET AUTOCOMMIT=0;
DELETE FROM LLAMADAS
WHERE NUMERO IN (SELECT NUMERO FROM NUMEROS WHERE TIPO = 'PREPAGO')
  AND INSTANTE BETWEEN '2023-10-01' AND '2023-12-31';
-- SET AUTOCOMMIT=1;

5. Incrementar saldo de teléfonos de Prepago de Ana Torrente Ortega

Incrementa en 10 euros el saldo de los teléfonos de Prepago de Ana Torrente Ortega.

UPDATE NUMEROS
SET SALDO = SALDO + 10
WHERE TIPO = 'PREPAGO'
  AND CLIENTE = (SELECT DNICLIENTE FROM CLIENTES WHERE APELLIDOS = 'TORRENTE ORTEGA' AND NOMBRE = 'ANA');

6. Clientes de Vera y Pulpí dados de alta el año pasado

Obtén la relación de clientes de Vera y Pulpí dados de alta el año pasado.

SELECT *
FROM CLIENTES
WHERE YEAR(FECHAALTA) = 2023
  AND CIUDAD IN ('VERA', 'PULPÍ');

7. Números y fecha de alta de teléfonos de Emilio Blanco Pérez

Obtén el número y fecha de alta de los números de teléfono del cliente Emilio Blanco Pérez.

SELECT NUMERO, FECHAALTA
FROM NUMEROS
WHERE CLIENTE IN (SELECT DNICLIENTE FROM CLIENTES WHERE NOMBRE = 'EMILIO' AND APELLIDOS = 'BLANCO PÉREZ');

8. Detalles de tarifa de teléfonos de Emilio Blanco Pérez

Muestra el número de teléfono, nombre de la tarifa y precio por minuto de esta, para los teléfonos del cliente Emilio Blanco Pérez.

SELECT N.NUMERO, T.NOMBRE AS TARIFA, T.PRECIO_MINUTO
FROM NUMEROS N
INNER JOIN TARIFAS T ON N.TARIFAS = T.CODTARIFA 
WHERE N.CLIENTE IN (SELECT DNICLIENTE FROM CLIENTES WHERE NOMBRE = 'EMILIO' AND APELLIDOS = 'BLANCO PÉREZ');

9. Número total de teléfonos por cliente

Muestra el número total de teléfonos que tiene cada cliente, indicando el DNI, Nombre y Apellidos del cliente.

SELECT C.DNICLIENTE, C.NOMBRE, C.APELLIDOS, COUNT(N.NUMERO) AS TOTAL_TELEFONOS
FROM CLIENTES C
INNER JOIN NUMEROS N ON C.DNICLIENTE = N.CLIENTE
GROUP BY C.DNICLIENTE, C.NOMBRE, C.APELLIDOS;

10. Clientes con más de un número de teléfono Prepago

Obtén la relación de clientes que tienen más de un número de teléfono en la modalidad Prepago.

SELECT C.DNICLIENTE, C.APELLIDOS, C.NOMBRE, COUNT(N.NUMERO) AS TOTAL_PREPAGO
FROM CLIENTES C
INNER JOIN NUMEROS N ON C.DNICLIENTE = N.CLIENTE
WHERE N.TIPO = 'PREPAGO'
GROUP BY C.DNICLIENTE, C.APELLIDOS, C.NOMBRE
HAVING COUNT(N.NUMERO) > 1;

Nota: Las siguientes sentencias INSERT y el comentario parecen ser para pruebas y configuración de datos para esta consulta:

-- Datos de ejemplo y prueba
INSERT INTO CLIENTES (DNICLIENTE, NOMBRE, APELLIDOS, DIRECCION, CIUDAD, SEXO, FECHAALTA) 
VALUES ('666666666', 'Ana', 'Torrente Ortega', 'LA QUE SEA', 'GARRUCHA', 'M', CURRENT_DATE());

INSERT INTO NUMEROS (NUMERO, CLIENTE, TARIFA, TIPO, FECHAALTA, SALDO) 
VALUES ('606999999', '666666666', 3, 'CONTRATO', CURRENT_DATE(), NULL);

-- (CORREGIR PARÁMETROS PARA COMPROBAR POSTERIORMENTE QUITANDO EL DNI CLIENTES) -- Comentario original

INSERT INTO NUMEROS (NUMERO, CLIENTE, TARIFA, TIPO, FECHAALTA, SALDO) 
VALUES ('606777777', '333333333', 1, 'PREPAGO', CURRENT_DATE(), 20);

11. Teléfonos sin llamadas realizadas ni recibidas

Identifica los números de teléfono que nunca han realizado ni recibido una llamada.

(La siguiente consulta SQL proporcionada en el documento original parece no corresponder con la pregunta y podría pertenecer a otro contexto de base de datos):

SELECT COUNT(CODAL)
FROM ALUMNOS
WHERE FECHANACIMIENTO > '2006-02-26';

12. Teléfonos sin llamadas realizadas, pero con llamadas recibidas

Identifica los números de teléfono que nunca han realizado una llamada pero que sí han recibido.

(La siguiente consulta SQL proporcionada en el documento original parece no corresponder con la pregunta y podría pertenecer a otro contexto de base de datos):

SELECT COUNT(CODAL)
FROM ALUMNOS
WHERE FECHANACIMIENTO > '2006-02-26'
  AND CIUDAD NOT IN ('HUÉRCAL-OVERA');

13. Total de teléfonos por tarifa

Calcula el número total de teléfonos que están acogidos a cada tarifa. Se debe indicar el nombre de la tarifa y contemplar que puede haber tarifas sin números acogidos.

(La siguiente consulta SQL proporcionada en el documento original parece no corresponder con la pregunta y podría pertenecer a otro contexto de base de datos):

SELECT *
FROM PROFESORES
WHERE DEPARTAMENTO = 'INFORMATICA'
  AND SUELDO BETWEEN 1500 AND 1800;

14. Teléfonos con más de dos llamadas realizadas este mes

Obtén la relación de números de teléfono con más de dos llamadas realizadas en lo que va de mes.

(La siguiente consulta SQL proporcionada en el documento original parece no corresponder con la pregunta y podría pertenecer a otro contexto de base de datos):

SELECT *
FROM ALUMNOS
WHERE CODAL IN (
    SELECT CODAL
    FROM MATRICULA
    WHERE CURSO = '11-12'
      AND CODAS IN (
          SELECT CODAS
          FROM ASIGNATURAS
          WHERE NOMBRE = 'SERVICIOS DE RED'
      )
);

15. Duración media de llamadas recibidas en 2013

Calcula la duración media en segundos de las llamadas recibidas en el año 2013.

(La siguiente consulta SQL proporcionada en el documento original parece no corresponder con la pregunta y podría pertenecer a otro contexto de base de datos):

SELECT AVG(Nota) AS NotaMedia
FROM Notas
JOIN Alumnos ON Notas.Alumnos = Alumno.Alumnos
WHERE Nombre.Alumnos = 'Emilio Parra Sanz'
  AND Notas.Asignatura = 'PAR';

16. Total de minutos por teléfono de María Soler Asensio

Calcula el total de minutos que ha sido utilizado cada teléfono de la cliente María Soler Asensio.

(La primera consulta SQL proporcionada bajo este punto en el documento original parece incompleta o no directamente relacionada con la pregunta principal):

SELECT AVG(DURACION)
FROM LLAMADAS
WHERE TIPOLLAMADA = 'E'
  AND YEAR(INSTANTE) = '2013';

(La siguiente consulta parece ser la solución principal a la pregunta):

SELECT NUMERO, SUM(DURACION) / 60 AS TOTAL_MINUTOS
FROM LLAMADAS
WHERE NUMERO IN (
    SELECT NUMERO
    FROM NUMEROS
    WHERE CLIENTE = (
        SELECT DNICLIENTE
        FROM CLIENTES
        WHERE NOMBRE = 'MARÍA' AND APELLIDOS = 'SOLER ASENSIO'
    )
)
GROUP BY NUMERO;

17. Duración media de llamadas (>30s) por teléfono en 2013

Calcula la duración media en segundos de las llamadas realizadas por cada teléfono en el año 2013 y cuya duración media fuera superior a 30 segundos.

(Nota: La consulta proporcionada filtra por AVG(DURACION) > 50, mientras que la pregunta especifica “superior a 30 segundos”.)

SELECT NUMERO, AVG(DURACION) AS "DURACION MEDIA"
FROM LLAMADAS
WHERE YEAR(INSTANTE) = '2013' AND TIPOLLAMADA = 'S'
GROUP BY NUMERO
HAVING AVG(DURACION) > 50; -- O > 30 según el enunciado

18. Clientes con más de 20 minutos en llamadas realizadas

Muestra los datos de los clientes que han realizado llamadas por un tiempo superior a 20 minutos (la duración de las llamadas está presumiblemente en segundos).

SELECT C.DNICLIENTE, C.APELLIDOS, C.NOMBRE, SUM(LL.DURACION) AS TIEMPO_TOTAL_LLAMADAS_SEGUNDOS
FROM CLIENTES C
INNER JOIN NUMEROS N ON C.DNICLIENTE = N.CLIENTE
INNER JOIN LLAMADAS LL ON N.NUMERO = LL.NUMERO
WHERE LL.TIPOLLAMADA = 'S'
GROUP BY C.DNICLIENTE, C.APELLIDOS, C.NOMBRE
HAVING SUM(LL.DURACION) > (20 * 60); -- 20 minutos en segundos

Nota del documento original: “cambiar el parámetro de 20 por un 7, debido a que no hay llamadas de 20 min, de otra forma tocaría insertar datos nuevos con esos parámetros”. La consulta original usaba HAVING SUM(DURACION) > 7*60 (7 minutos). Para cumplir el enunciado de “20 minutos”, debería ser > 20*60.

19. Gasto total de José Álvarez Barrendero en enero de 2014

Calcula el gasto total en euros del cliente José Álvarez Barrendero en el mes de enero de 2014.

SELECT SUM(LL.DURACION * T.PRECIO_MINUTO) AS GASTO_TOTAL_EUROS
FROM CLIENTES C
INNER JOIN NUMEROS N ON C.DNICLIENTE = N.CLIENTE
INNER JOIN LLAMADAS LL ON N.NUMERO = LL.NUMERO
INNER JOIN TARIFAS T ON T.CODTARIFA = N.TARIFA
WHERE LL.TIPOLLAMADA = 'S'
  AND C.NOMBRE = 'JOSÉ'
  AND C.APELLIDOS = 'ÁLVAREZ BARRENDERO'
  AND LL.INSTANTE BETWEEN '2014-01-01 00:00:00' AND '2014-01-31 23:59:59';

Nota del documento original: “No hizo llamadas en el mes de enero pero si cambiamos la fecha por el mes de marzo nos deberían salir 9,54”.

Consideración: Si DURACION está en segundos y PRECIO_MINUTO es el precio por minuto, la fórmula del costo debería ser SUM((LL.DURACION / 60.0) * T.PRECIO_MINUTO). Si DURACION ya está en minutos, la fórmula original es correcta.