viernes, 24 de febrero de 2017

J02: Proyecto Final

Descripción


Sistema de Inventarios para las ventas de un almacén.  El almacén posee varias sucursales de venta, cada sucursal de venta pertenece a un Departamento específico (Guatemala, Quetzaltenango, etc.)

https://drive.google.com/open?id=0B7Ct7K_LTJvSUnFubjhCOXpHZ1U


Diagrama Entidad - Relación





Scripts de SQL Server


Create Base de datos
https://drive.google.com/open?id=0B7Ct7K_LTJvSTWNSRlB6djJKc00


Create Tablas y Llaves Primarias
https://drive.google.com/open?id=0B7Ct7K_LTJvSV2xoQ3NXTXF6Vkk

Insert Tabla TipoMovimiento, TipoVenta, Departamento
https://drive.google.com/open?id=0B7Ct7K_LTJvSZkQ3eDFJRzd3ZzQ




jueves, 9 de febrero de 2017

J02: Programación en Java: Referencias

Referencias

Colecciones


Interfaces
https://docs.oracle.com/javase/tutorial/collections/interfaces/index.html

Implementaciones
https://docs.oracle.com/javase/tutorial/collections/implementations/index.html

General
https://docs.oracle.com/javase/7/docs/api/index.html?java/util/Collections.html


JavaFX 


Combo Box

Class ComboBox<T>
items
http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ComboBox.html#itemsProperty

12 Table View
http://docs.oracle.com/javafx/2/ui_controls/table-view.htm

Class TableView<S>
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableView.html

26 Date Picker
https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/date-picker.htm

Class LocalDate
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
getMonth()
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#getMonth--
getYear()
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#getYear--

Tutorial JavaFX 8 - Parte 2: Modelo y TableView
http://code.makery.ch/library/javafx-8-tutorial/es/part2/

Understanding the JavaFX Beans Convention (Properties and Bindings) Part 1
http://what-when-how.com/javafx-2/understanding-the-javafx-beans-convention-properties-and-bindings-part-1/



JDBC


Interface Connection
https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html

Interface Statement
https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html

Interface ResultSet
https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

Class SQLException
https://docs.oracle.com/javase/7/docs/api/java/sql/SQLException.html

Lesson: JDBC Basics
https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html

JDBC Tutorial
https://www.tutorialspoint.com/jdbc/index.htm


Demostración JavaFX ComboBox


Base de datos y Librería de Acceso (JDBC Driver) para Microsoft Access
Desempacar en el directorio c:\dbAccess\

https://drive.google.com/open?id=0B7Ct7K_LTJvSc1AwTUZPbUh1bHc



Proyecto 1: Demostración con Lista

https://drive.google.com/open?id=0B7Ct7K_LTJvSOFN0RzBTRDBiVDg



Proyecto 2: Demostración almacenado el código en la lista de items del ComboBox

https://drive.google.com/open?id=0B7Ct7K_LTJvSa3BTSmlSb2JqajA




Demostración JavaFX Forma Modal (Login)

En este proyecto la forma de Inicio de Sesión (Login), se muestra como una forma Modal, y el usuario tiene que Iniciar Sesión con los valores Correctos o Cancelar, para cerrar la ventana Modal.

https://drive.google.com/open?id=0B7Ct7K_LTJvSTk5UVVhXQ01KQW8







J02: Programación en Java: Resumen



Presentación


Módulo 01: Colecciones
https://drive.google.com/open?id=0B7Ct7K_LTJvScFh0MWxENWdCX0E


Módulo 02: Herencia
https://drive.google.com/open?id=0B7Ct7K_LTJvSYlBVLVdQUzF3ems


Módulo 03: JDBC
https://drive.google.com/open?id=0B7Ct7K_LTJvSZ1hWTDRBcjR0aG8

Código Demo
https://drive.google.com/open?id=0B7Ct7K_LTJvSMU5nNlV3a1ZtRDQ


Laboratorio


Colecciones



Parte 1
https://drive.google.com/open?id=0B7Ct7K_LTJvSOHRXd2RTSlhkY2M

Parte 2
https://drive.google.com/open?id=0B7Ct7K_LTJvSRkRKa1hqcXJmRzQ



JDBC

Parte 1
https://drive.google.com/open?id=0B7Ct7K_LTJvSVFZqbWd5M3pqeWM

Parte 2
https://drive.google.com/open?id=0B7Ct7K_LTJvSUGR0NDdvbW5qdHc

Parte 3
https://drive.google.com/open?id=0B7Ct7K_LTJvSSVdQamN2d19DTHc

Parte 4
https://drive.google.com/open?id=0B7Ct7K_LTJvSckJ5S2VGR0FtMTA

https://drive.google.com/open?id=0B7Ct7K_LTJvSN3dmMHZJTDh4LWs


Parte 5

https://drive.google.com/open?id=0B7Ct7K_LTJvSazdFTVNOb0QxMVk

https://drive.google.com/open?id=0B7Ct7K_LTJvSOWdvNjJVeDZvTEU

Ejemplo de Manejo de Fechas en Propiedades (Modificación a la Consulta Tarjetas)
https://drive.google.com/open?id=0B7Ct7K_LTJvSeThKQ0sybF9rYTA


Parte 6

Agregar una forma para realizar Cargos a la tarjeta, utilizando el procedimiento almacenado paCargoTarjeta.

Agregar una forma para realizar Abonos a la tarjeta, utilizando el procedimiento almacenado paAbonoTarjeta.


Parte 7
Agregar una forma para permitir agregar nuevos Clientes (Cliente Alta) a la tabla correspondiente, pero utilizando el procedimiento almacenado paClienteAlta.

Agregar una forma para permitir dar de baja a los Clientes (Cliente Baja), utilizando el procedimiento almacenado paClienteBaja.



Referencias

http://galileotalentodigital.blogspot.com/2017/02/j02-programacion-en-java-referencias.html




Proyecto Final

http://galileotalentodigital.blogspot.com/2017/02/j02-proyecto-final.html











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;