Mostrando las entradas con la etiqueta Fundamentos de Bases de Datos. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Fundamentos de Bases de Datos. Mostrar todas las entradas

domingo, 5 de febrero de 2017

Fundamentos de Bases de Datos: Ejercicios 2017/Febrero/06


Modelo Relacional


Ejercicio 5



  1. Definir un procedimiento almacenado de nombre paActualizarClienteIniciales, recibe como parámetro @CodCliente con valor por omisión 0 (Cero).  Debe actualizar la Columna SaldoActual y la Columna FechaSaldo de la Tabla Tarjeta con el Saldo correspondiente a todos los movimientos de cada tarjeta.  La FechaSaldo debe ser actualizada al valor de la fecha actual.  Para todas las tarjetas del @CodCliente.
  2. Definir un procedimiento almacenado de nombre paBajaClienteIniciales, recibe como parámetro el @CodCliente con valor por omisión 0 (Cero).  Primero, debe invocar al procedimiento paActualizarClienteIniciales con @CodCliente, luego debe cambiar la Columna Estado de 'A' a 'B' si la Suma de la Columa SaldoActual de las Tarjetas del Cliente es igual a 0 (Cero), de lo contrario debe enviar un mensaje de error con Raiserror.
  3. Definir un procedimiento almacenado de nombre paAltaClienteIniciales, recibe un parámetro por cada columna de la tabla menos la columna CodCliente y la Columna Estado.  Inserta una nueva fila en la tabla Cliente, con la Columna Estado igual a 'A'.  Finalmente debe tener una instrucción return @@Identity;


Ejercicio 6


Definir un procedimiento almacenado de nombre paCargoTarjetaIniciales, recibe como parámetros:

  • @NumeroTarjeta con valor por omisión "", 
  • @Monto con valor por omisión 0 (Cero),
  • @Fecha con valor por omisión GETDATE(),

Este procedimiento almacenado invoca al procedimiento paActualizarSaldoIniciales con el CodTarjeta y luego inserta una fila en la tabla Movimiento, si se cumplen las siguientes condiciones:

  1. Si el cliente en la columna propietario de la tarjeta tiene la columna Estado = 'A'
  2. Si el @NumeroTarjeta tiene una FechaVencimiento mayor a la fecha actual,
  3. Si el @Monto es mayor que 0 (Cero),
  4. Si el @Monto + SaldoActual es menor que la Columna LimiteCredito,
  5. De lo contrario debe enviar un mensaje de error con Raiserror.

El valor de la columna  Abono en la tabla de Movimiento debe ser igual a Cero, para esta fila.


Ejercicio 7


Definir un procedimiento almacenado de nombre paAbonoTarjetaIniciales, recibe como parámetros:

  • @NumeroTarjeta con valor por omisión "", 
  • @Monto con valor por omisión 0 (Cero),
  • @Fecha con valor por omisión GETDATE(),

Este procedimiento almacenado invoca al procedimiento paActualizarSaldoIniciales con el CodTarjeta y luego inserta una fila en la tabla Movimiento, si se cumplen las siguientes condiciones:

  1. Si el cliente en la columna propietario de la tarjeta tiene la columna Estado = 'A', y el @Monto es mayor que 0 (Cero), entonces permite insertar la información.
  2. Si el cliente en la columna propietario de la tarjeta tiene la columna Estado = 'B', y la Columan SaldoActual es mayor que 0 (Cero), entonces permite insertar la información.
  3. De lo contrario debe enviar un mensaje de error con Raiserror.

El valor de la columna  Cargo en la tabla de Movimiento debe ser igual a Cero, para esta fila.








viernes, 3 de febrero de 2017

Fundamentos de Bases de Datos: Ejemplos 2017/02/03

Ejemplos Vistas


-- Obtiene la suma de Cargo, Abono y el Saldo
-- Agrupado por tarjeta

CREATE VIEW [dbo].[vTarjetaSaldoDS]
AS
SELECT        CodTarjeta, SUM(Cargo) AS SumaCargo, SUM(Abono) AS SumaAbono,
       SUM(Cargo - Abono) AS SaldoActualReal
       FROM            dbo.Movimiento
GROUP BY CodTarjeta

GO


-- Lista las tarjetas cuyo Tarjeta.SaldoActual sea diferente de la vista
CREATE VIEW [dbo].[vSaldoDiferenteDS]
AS
SELECTTarjeta.CodTarjeta, Tarjeta.CodCliente, Tarjeta.NumeroTarjeta, Tarjeta.FechaVencimiento, Tarjeta.LimiteCredito,
Tarjeta.SaldoActual, dbo.vTarjetaSaldoDS.SaldoActualReal
FROM            dbo.Tarjeta
INNER JOIN  dbo.vTarjetaSaldoDS
ON dbo.Tarjeta.CodTarjeta = dbo.vTarjetaSaldoDS.CodTarjeta
WHERE        (NOT (Tarjeta.SaldoActual = vTarjetaSaldoDS.SaldoActualReal))


GO



Ejemplos Procedimientos Almacenados



-- =============================================
-- Author:          Daniel Santizo Saldaña
-- Create date: 20170203
-- Description:     Actualizar saldo Tarjeta por medio del CodTarjeta
-- =============================================
CREATE PROCEDURE paActualizarSaldoDS
       -- Add the parameters for the stored procedure here
       @CodTarjeta int = 0
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;
       -- VARIABLE
       DECLARE @SaldoReal DECIMAL = 0;
       -- CONSULTA por el Saldo
       SELECT @SaldoReal = SaldoActualReal
             FROM vTarjetaSaldoDS
             WHERE CodTarjeta = @CodTarjeta;
       -- ACTUALIZAR EL SALDO en la Tabla Tarjeta
       UPDATE Tarjeta
             SET SaldoActual = @SaldoReal
             WHERE CodTarjeta = @CodTarjeta;
END
GO



-- =============================================
-- Author:          Daniel Santizo Saldaña
-- Create date: 20170203
-- Description:     Cambio el Estado del Cliente sino tiene Saldo Pendiente
-- =============================================
CREATE PROCEDURE paClienteBajaDS
       -- Add the parameters for the stored procedure here
       @CodCliente int = 0
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

    -- Insert statements for procedure here
       DECLARE @Saldo decimal = 0;
       SELECT @Saldo = SUM(v.SaldoActualReal)
             FROM Tarjeta T
             INNER JOIN vTarjetaSaldoDS v
             ON T.CodTarjeta = v.CodTarjeta
             WHERE T.CodCliente = @CodCliente;
       -- SI EL SALDO ES IGUAL A 0
       IF (@Saldo = 0)
             UPDATE Cliente
                    SET Estado = 'B'
                    WHERE CodCliente = @CodCliente;
       ELSE
             RAISERROR( 'El Cliente %d tienen un saldo',
                    3, 5, @CodCliente);

       RETURN @Saldo;
END

GO





miércoles, 1 de febrero de 2017

Fundamentos de Bases de Datos: Ejemplos 2017/02/01

Ejemplos


-- SELECCIONA LA BASE DE DATOS A TRABAJAR
USE CrediSeguro;
GO
/*
     Ejemplos de SELECT
     2017/02/01
*/
SELECT CodCliente, Nombre, Apellido,
     FechaNacimiento
     FROM Cliente;
--SELECT con Cláusula WHERE
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     WHERE CodCliente > 1989;
-- SELECT x Apellido = Rivera
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     WHERE Apellido = 'Rivera';
-- SELECT con Funciones Built-In
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     WHERE YEAR(FechaNacimiento) = 1979;

-- SELECT con WHERE y AND
-- Nacidos en Febrero y día 1
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     WHERE MONTH(FechaNacimiento) = 2
     AND DAY(FechaNacimiento) = 1;

-- SELECT con RANGO
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     WHERE MONTH(FechaNacimiento) = 2
     AND DAY(FechaNacimiento) BETWEEN 10 AND 14;

-- SELECT con RANGO y ORDER BY
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     WHERE MONTH(FechaNacimiento) = 2
     AND DAY(FechaNacimiento) BETWEEN 10 AND 14
     ORDER BY DAY(FechaNacimiento);

-- TODOS LOS CLIENTES ORDENADOS POR
-- EL MES Y EL DIA DE SU FechaNacimiento
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     ORDER BY MONTH(FechaNacimiento), DAY(FechaNacimiento),
     Apellido, Nombre;

-- TODOS LOS CLIENTES ordenados por
-- Mes y día de su FechaNacimiento, Apellidos y Nombres DESC
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     ORDER BY MONTH(FechaNacimiento), DAY(FechaNacimiento),
     Apellido DESC, Nombre DESC;

-- SELECT WHERE LIKE
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     WHERE YEAR(FechaNacimiento) BETWEEN 1970 AND 1985
     AND Apellido LIKE 'M%'
     ORDER BY Apellido, Nombre;

-- SELECT WHERE NOT
SELECT Apellido, Nombre,
     FechaNacimiento, CodCliente
     FROM Cliente
     WHERE YEAR(FechaNacimiento) BETWEEN 1980 AND 1985
     AND NOT Apellido LIKE 'Mi%'
     ORDER BY Apellido, Nombre;

-- INNER JOIN Cliente y Tarjeta
SELECT Apellido, Nombre,
     Cliente.CodCliente, FechaNacimiento,
     Tarjeta.NumeroTarjeta, FechaVencimiento,
     SaldoActual
     FROM Cliente
     INNER JOIN Tarjeta
         ON Cliente.CodCliente =Tarjeta.CodCliente
     WHERE FechaVencimiento > GETDATE()
     AND SaldoActual > 20000
     ORDER BY FechaVencimiento, Apellido, Nombre;

-- INNER JOIN Cliente y Tarjeta
SELECT   Apellido, Nombre,
     FechaNacimiento, Cliente.CodCliente,
     NumeroTarjeta, FechaVencimiento, SaldoActual
     FROM Cliente
     INNER JOIN Tarjeta
         ON Cliente.CodCliente = Tarjeta.CodCliente
     WHERE FechaVencimiento > GETDATE()
     ORDER BY FechaVencimiento;

-- INNER JOIN Tarjeta y Movimiento
SELECT NumeroTarjeta, FechaVencimiento,
     SaldoActual,
     M.Fecha, Abono, Cargo
     FROM Tarjeta T
     INNER JOIN Movimiento M
         ON T.CodTarjeta = M.CodTarjeta
     WHERE FechaVencimiento > GETDATE()
     AND Cargo > 3000
     ORDER BY NumeroTarjeta;





-- INNER JOIN Tarjeta y Movimiento
SELECT   NumeroTarjeta, FechaVencimiento,
     SaldoActual,
     Fecha, Cargo, Abono
     FROM Tarjeta
     INNER JOIN Movimiento
         ON Tarjeta.CodTarjeta = Movimiento.CodTarjeta
     WHERE FechaVencimiento > GETDATE();

-- INNER JOIN Cliente, Tarjeta, Movimiento
SELECT Apellido, Nombre, FechaNacimiento,
     Cliente.CodCliente,
     Tarjeta.NumeroTarjeta, FechaVencimiento,
     SaldoActual,
     Fecha, Abono, Cargo
     FROM Cliente
     INNER JOIN Tarjeta
         ON Cliente.CodCliente = Tarjeta.CodCliente
     INNER JOIN Movimiento
         ON Tarjeta.CodTarjeta = Movimiento.CodTarjeta
     WHERE FechaVencimiento > GETDATE()
     AND Cargo > 4500
     AND YEAR(Fecha) = 2014
     ORDER BY Apellido, Nombre, NumeroTarjeta,
         Fecha;



-- INNER JOIN Cliente, Tarjeta, Movimiento
SELECT Apellido, Nombre, Cliente.CodCliente,
     NumeroTarjeta, FechaVencimiento, SaldoActual,
     Movimiento.Fecha, Movimiento.Abono, Cargo
     FROM Cliente
     INNER JOIN Tarjeta
         ON Cliente.CodCliente = Tarjeta.CodCliente
     INNER JOIN Movimiento
         ON Tarjeta.CodTarjeta = Movimiento.CodTarjeta
     WHERE FechaVencimiento > GETDATE()
     AND Cargo > 1000
     AND Cliente.CodCliente BETWEEN 100 AND 125
     ORDER BY Apellido, Nombre, NumeroTarjeta, Fecha;



-- EJEMPLO Query Designer
-- Menú de Query, Design Query in Editor (Ctrl+Shift+Q)
SELECT        Cliente.Apellido, Cliente.Nombre,
     Cliente.FechaNacimiento, Cliente.CodCliente,
     Tarjeta.NumeroTarjeta, Tarjeta.FechaVencimiento,
     Tarjeta.SaldoActual, Movimiento.Fecha, Movimiento.Abono,
                         Movimiento.Cargo
FROM            Cliente 
INNER JOIN Tarjeta
 ON Cliente.CodCliente = Tarjeta.CodCliente
INNER JOIN Movimiento
 ON Tarjeta.CodTarjeta = Movimiento.CodTarjeta
WHERE        (Tarjeta.FechaVencimiento > GETDATE())
     AND (Movimiento.Cargo > 4500)
ORDER BY Cliente.Apellido, Cliente.Nombre, Tarjeta.NumeroTarjeta, Movimiento.Fecha



-- EJEMPLO Query Designer
-- Menú de Query, Design Query in Editor (Ctrl+Shift+Q)
SELECT Cliente.Apellido, Cliente.Nombre, 
Cliente.CodCliente,
Tarjeta.NumeroTarjeta, Tarjeta.FechaVencimiento,
Tarjeta.LimiteCredito, Tarjeta.SaldoActual,
Movimiento.Fecha, Movimiento.Abono,
Movimiento.Cargo
FROM Cliente
INNER JOIN Tarjeta 
ON Cliente.CodCliente = Tarjeta.CodCliente
INNER JOIN Movimiento 
ON Tarjeta.CodTarjeta = Movimiento.CodTarjeta

WHERE        (Tarjeta.FechaVencimiento > GETDATE())
ORDER BY Cliente.Apellido, Cliente.Nombre, Tarjeta.NumeroTarjeta, Movimiento.Fecha




-- EL USO DE COUNT
SELECT COUNT(*) AS NoClientes
     FROM Cliente;

SELECT COUNT(*) AS Tarjetas23
     FROM Tarjeta
     WHERE CodCliente = 23;

SELECT COUNT(*) AS Tarjetas1898
     FROM Tarjeta
     WHERE CodCliente = 1898;

SELECT MAX(Cargo) AS Maximo
     FROM Movimiento;
SELECT MIN(Cargo) AS Minimo2014
     FROM Movimiento
     WHERE YEAR(Fecha) = 2014;
SELECT MIN(Cargo) AS Minimo2015
     FROM Movimiento
     WHERE YEAR(Fecha) = 2015;

-- Listado de Operaciones
SELECT NumeroTarjeta, Fecha, Abono, Cargo
     FROM Tarjeta
     INNER JOIN Movimiento ON Tarjeta.CodTarjeta = Movimiento.CodTarjeta
     WHERE YEAR(Fecha) = 2014
     ORDER BY NumeroTarjeta, Fecha;

SELECT NumeroTarjeta, COUNT(*) AS NoMovimientos
     , SUM(Cargo) AS SumaCargo, AVG(Cargo) AS PromedioCargo
     FROM Tarjeta
     INNER JOIN Movimiento
         ON Tarjeta.CodTarjeta = Movimiento.CodTarjeta
     WHERE YEAR(Fecha) = 2014
     GROUP BY NumeroTarjeta;


-- Información Resumen por Mes de Movimientos
SELECT YEAR(Fecha) AS Anio, MONTH(Fecha) AS Mes,
     COUNT(*) AS Conteo, AVG(Cargo) AS Promedio
     , MAX(Cargo) AS Maximo, MIN(Cargo) AS Minimo
     , SUM(Cargo) AS SumaCargo, SUM(Abono) AS SumaAbono
     FROM Movimiento
     GROUP BY YEAR(Fecha), MONTH(Fecha)

     ORDER BY YEAR(Fecha), MONTH(Fecha);




-- CONTEO DE FILAS
SELECT COUNT(*) AS TotalMovs
     FROM Movimiento;

-- SUMATORIA de las Columnas
SELECT SUM(Cargo) AS TotalCargo,
     SUM(Abono) AS TotalAbono
     FROM Movimiento;

-- PROMEDIO x Tarjeta
SELECT CodTarjeta, AVG(Cargo) AS Promedio
     FROM Movimiento
     GROUP BY CodTarjeta;

SELECT CodTarjeta, Cargo, Fecha
     FROM Movimiento
     ORDER BY CodTarjeta;

-- Datos Generales por Tarjeta
-- Año 2015
-- Tarjetas con Más de 3 Movimientos o Más
SELECT CodTarjeta, COUNT(Cargo) AS Cantidad,
     SUM(Cargo) AS Total, AVG(Cargo) AS Promedio,
     MIN(Cargo) AS Minimo, MAX(Cargo) AS Maximo
     FROM Movimiento
     WHERE YEAR(Fecha) = 2015
     GROUP BY CodTarjeta
     HAVING COUNT(Cargo) > 2

     ORDER BY CodTarjeta;




USE CrediSeguro;
GO
-- CONTEO DE FILAS
SELECT COUNT(*) AS TotalMovs
     FROM Movimiento;

-- SUMATORIA de las Columnas
SELECT SUM(Cargo) AS TotalCargo,
     SUM(Abono) AS TotalAbono
     FROM Movimiento;

-- PROMEDIO x Tarjeta
SELECT CodTarjeta, AVG(Cargo) AS Promedio
     FROM Movimiento
     GROUP BY CodTarjeta;

SELECT CodTarjeta, Cargo, Fecha
     FROM Movimiento
     ORDER BY CodTarjeta;

-- Datos Generales por Tarjeta
-- Año 2015
-- Tarjetas con Más de 3 Movimientos o Más
SELECT CodTarjeta, COUNT(Cargo) AS Cantidad,
     SUM(Cargo) AS Total, AVG(Cargo) AS Promedio,
     MIN(Cargo) AS Minimo, MAX(Cargo) AS Maximo
     FROM Movimiento
     WHERE YEAR(Fecha) = 2015
     GROUP BY CodTarjeta
     HAVING COUNT(Cargo) > 2
     ORDER BY CodTarjeta;


SELECT CodCliente, Apellido, Nombre,
     FechaNacimiento
     FROM Cliente
     WHERE Apellido LIKE 'M%r%n'
     --AND Nombre LIKE 'A%r'

     ORDER BY Apellido, Nombre;