Академический Документы
Профессиональный Документы
Культура Документы
/*
Repasar...
___.___ ~ _____________
\ \\ \ ,, ??? | '\\\\\\
\ \\ \ /< ? | ' ____|_
--\//,- \_. /_____ | '||::::::
o- / \_/ '\ | '||_____|
| \ ' o \'________|_____|
| )- # < ___/____|___\___
`_/'------------| _ ' <<<:|
/________\| |_________'___o_o|
*/
LOG ON(
NAME=Empresa7_log,
FILENAME='C:\Datos\Empresa7.ldf',
SIZE=4 MB,
MAXSIZE=12 MB,
FILEGROWTH=1 mb
)
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
------------------------------------------------
-- (1) Restricci�n: PRIMARY KEY
------------------------------------------------
------------------------------------------------
-- (2) Restricci�n: UNIQUE
------------------------------------------------
-- Pruebo el error
INSERT Cliente(IdCliente, Nombre, Ruc)
VALUES ('C0002', 'Comercial Alpha', '12345678902')
GO
-- Insertando 4 registros
INSERT Linea (Nombre)
VALUES ('Frutas')
------------------------------------------------
-- (3) Restricci�n: FOREIGN KEY
------------------------------------------------
-- A�adiremos el Campo Linea a la Tabla PRODUCTO
ALTER TABLE Producto
ADD Linea INT NOT NULL
GO
-- �xito
INSERT Producto(IDProducto, Nombre, Precio, Linea)
VALUES ('P0001', 'Sand�a', 3, 1)
GO
-- �xito
INSERT Producto(IDProducto, Nombre, Precio, Linea)
VALUES ('P0002', 'Jamonada', 2, 4)
GO
------------------------------------------------
-- (4) Restricci�n: CHECK
------------------------------------------------
-- Error
INSERT Producto(IdProducto, Nombre, Precio, Linea)
VALUES ('A', 'Yogurt', 7, 3)
GO
-- Error
INSERT Producto(IdProducto, Nombre, Precio, Linea)
VALUES ('P0000', 'Yogurt', 7, 3)
GO
-- �xito
INSERT Producto(IdProducto, Nombre, Precio, Linea)
VALUES ('P0003', 'Yogurt', 7, 3)
GO
-- Error
INSERT Producto(IdProducto, Nombre, Precio, Linea)
VALUES ('P0004', 'Fanta', -5, 2)
GO
-- �xito
INSERT Producto(IdProducto, Nombre, Precio, Linea)
VALUES ('P0004', 'Fanta', 5, 2)
GO
SELECT * FROM Producto
GO
-- �xito
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00001', 'C0001', 'P0003', 200, '25-03-2017', '28-03-2017')
GO
--Eso jam�s debi� suceder, pero en la Tabla Pedido ya figura como un registro
v�lido.
SELECT * FROM Pedido
GO
-- Error
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00002', 'C0003', 'P0004', 30, '28-03-2017', '30-03-2000')
GO
-- �xito
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00002', 'C0003', 'P0004', 30, '28-03-2017', '30-03-2017')
GO
-- �xito
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00003', 'C0002', 'P0002', 7, '01-04-2017', '01-04-2017')
GO
--Para cualquier pedido, la cantidad debe ser positiva y no puede pasar de 300
Sp_HelpConstraint Pedido
GO
-- Error
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00004', 'C0003', 'P0001', 800, '02/04/2017', '04/04/2017')
GO
-- Error
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00004', 'C0003', 'P0001', 0, '02/04/2017', '04/04/2017')
GO
-- �xito
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00004', 'C0003', 'P0001', 250, '02/04/2017', '04/04/2017')
GO
Sp_HelpConstraint Pedido
GO
-- Error
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00005', 'C0001', 'P0004', 19, '03.04.2020', '05.04.2017')
GO
-- �xito
INSERT Pedido(IDPedido, Cliente, Producto, Cantidad, Fecha_Pedido, Fecha_Entrega)
VALUES('PX00005', 'C0001', 'P0004', 19, '03.04.2017', '05.04.2017')
GO
------------------------------------------------
-- (5) Restricci�n: DEFAULT
------------------------------------------------
Sp_HelpConstraint Empleado
GO
INSERT Empleado
VALUES ('Rosa', 'Cuzco')
GO
Sp_HelpConstraint Empleado
GO
-- Notas
-- Nota 1: Es MUY recomendable no crear PK's y FK's "al paso", es decir, al lado de
la columna.
-- Es mejor crear la tabla en un primer paso.
-- Luego con un ALTER se agregan los Pk's y FK's necesarios.
-- Nota 2: IDENTITY para PK tiene ventajas/desventajas. Abierto a debate e
investigaci�n.
-- Nota 3: Us� el tipo de dato Date en lugar de Datetime para tener s�lo fechas y
no fechas con horas.
-- Nota 4: Siempre es bueno nombrar restricciones con prefijos adecuados
-- PK, UN, FK, CK, DF
-- Nota 5: Los constraints no se modifican, se borran y se vuelven a crear.
/*---------------------------------------
Profesor: Ing. F. Erick Tamayo
E-mail: f.erick.tamayo@gmail.com
Curso: Base de Datos
Sesi�n 3 TSQL
---------------------------------------*/
/*
___.___ ~ _____________
\ \\ \ ,, ??? | '\\\\\\
\ \\ \ /< ? | ' ____|_
--\//,- \_. /_____ | '||::::::
o- / \_/ '\ | '||_____|
| \ ' o \'________|_____|
| )- # < ___/____|___\___
`_/'------------| _ ' <<<:|
/________\| |_________'___o_o|
*/
sp_helpdb
GO
--02 Usar la Base de Datos Northwind y dar un listado de todos los Clientes
USE Northwind
GO
--Usando AS
SELECT CustomerID AS C�digo, CompanyName AS Empresa, Country AS 'Pa�s de Origen'
FROM Customers
GO
--Sin usar AS
SELECT CustomerID C�digo, CompanyName Empresa, Country 'Pa�s de Origen'
FROM Customers
GO
--Algunos prefieren usar siempre '' con los Alias para que SSMS asigne un color
distintivo
SELECT CustomerID 'C�digo', CompanyName 'Empresa', Country 'Pa�s de Origen'
FROM Customers
GO
/*
Campo calculado:
---------------
Es un campo virtual, no existe f�sicamente en una Tabla.
Se obtiene como resultado de una expresi�n y est� basado
en otros campos almacenados f�sicamente en una o varias tablas.
*/
SELECT *,
UnitPrice*Quantity AS 'Subtotal',
UnitPrice*Quantity*Discount AS 'Monto del Dscto' ,
UnitPrice*Quantity*(1-Discount) AS 'Neto'
FROM [Order Details]
GO
SELECT *,
UnitPrice*Quantity AS 'Subtotal',
UnitPrice*Quantity*Discount AS 'Monto del Dscto' ,
UnitPrice*Quantity*(1-Discount) AS 'Neto',
UnitPrice*Quantity*(1-Discount)*0.18 AS 'IGV',
UnitPrice*Quantity*(1-Discount)*1.18 AS 'Monto Total'
FROM [Order Details]
GO
-- CL�USULA WHERE
--------------
--15 Listado de Proveedores de Reino Unido (Uk) que operen en Londres (London)
-- OPERADOR OR
-----------
--18 Listar aquellos clientes con los cuales el trato es directo con el due�o
-- para los pa�ses de Venezuela o Francia (France)
-- OPERADOR BETWEEN
----------------
-- Forma 1
SELECT * FROM Products
WHERE CategoryID='1' OR CategoryID='2' OR CategoryID='3' OR CategoryID='4'
GO
-- Forma 2
SELECT * FROM Products
WHERE CategoryID BETWEEN 1 and 4
GO
-- Forma 3
SELECT * FROM Products
WHERE CategoryID IN (1,2,3,4)
GO
-- WILDCARDS
-----------
-- (Manejando b�squedas de registros mediante caracteres)
-- Comprobamos su creaci�n
SELECT * FROM #PRODUCTOS
GO
-- Insertamos 4 productos
INSERT #PRODUCTOS
VALUES
('HELADO NESTLE'),
('LECHE NESTLE'),
('YOGURT NESTLE 1 LITRO'),
('NESTLE PACK (HELADO, LECHE, YOGURT)')
GO
*/
--22 Listado de Clientes que tengan como Primer Caracter la Letra A en el Nombre
--23 Listado de Clientes que tengan como �ltimo Caracter la Letra A en el Nombre
--25 Listado de Clientes que tengan como Tercer caracter la Letra A en el Nombre
-- CONCATENANDO CAMPOS
-------------------
SELECT
EmployeeID,
FirstName+' '+LastName AS 'Nombre Completo',
BirthDate, HireDate
FROM Employees
GO
-- CL�USULA ORDER BY
-----------------
-- CL�USULA TOP
------------
-- Sabemos que 4 registros comparten el segundo lugar y que todos ellos no han sido
mostrados.
-- Hag�moslo con empates
UPDATE Products
SET UnitPrice=7
WHERE ProductID=52
UPDATE Products
SET UnitPrice=7.45
WHERE ProductID=54
GO
----------------------------
-- CL�USULA SELECT DISTINCT
----------------------------
-- 38 Usando Distinct (muestra valores sin repeticiones)
-- Mostrar la lista �nica de Pa�ses de todos nuestros Clientes
--39 Mostrar la lista �nica de Pa�ses con Ciudades de todos nuestros Clientes
----------------------------------
-- FUNCIONES MATEM�TICAS --
----------------------------------
----------------------
-- Funci�n ROUND
----------------------
------------------------------
-- Funciones CEILING y FLOOR
------------------------------
-- 41 Funci�n Ceiling
-- (Aproxima forzosamente al entero m�s pr�ximo, mayor)
----------------------
-- Funci�n RAND
----------------------
-------------------
-- Funci�n ABS
-------------------
----------------------
-- Funci�n POWER
----------------------
----------------------
-- Funci�n SQRT
----------------------
----------------------
-- Funci�n SIGN
----------------------
-------------------------------
-- Funciones LOG, LOG10 y PI
-------------------------------
--52 Funci�n PI
SELECT PI() AS 'Valor de PI'
GO
/*---------------------------------------
Profesor: Ing. F. Erick Tamayo
E-mail: f.erick.tamayo@gmail.com
Curso: Base de Datos
Sesi�n 4 TSQL
---------------------------------------*/
/*
___.___ ~ _____________
\ \\ \ ,, ??? | '\\\\\\
\ \\ \ /< ? | ' ____|_
--\//,- \_. /_____ | '||::::::
o- / \_/ '\ | '||_____|
| \ ' o \'________|_____|
| )- # < ___/____|___\___
`_/'------------| _ ' <<<:|
/________\| |_________'___o_o|
*/
INSERT #Tabla
VALUES ('Hola', 'Unac')
GO
--Insertamos 7 ventas
INSERT #Venta
VALUES
('Carla', 'Dvd', '11/04/2017', 'Adaptador'),
('David', 'Equipo', '12/04/2017', 'Cd'),
('Sandra', 'Equipo', '12/04/2017', NULL),
('Jenny', 'Laptop', '12/04/2017', 'Cargador'),
('Alberto', 'Dvd', '13/04/2017', NULL),
('Carla', 'Impresora', '13/04/2017', NULL),
('Sandra', 'Web-cam', '14/04/2017', NULL)
GO
--Verificamos
SELECT * FROM #Venta
GO
-------------------------------------
-- B�squedas de Nulos y No Nulos
-------------------------------------
-- NULL es un estado
-- NULL significa que el valor de los datos de la columna no se conoce
--------------------------
-- Funci�n CONVERT y CAST
--------------------------
-- Intento
SELECT 'Fecha Venta: ' + Fecha
FROM #Venta
GO
-- �xito
SELECT
'Fecha Venta: ' + CONVERT(CHAR (10), Fecha) AS 'Usando Convert',
'Fecha Venta: ' + CAST(Fecha AS CHAR (10)) AS 'Usando Cast'
FROM #Venta
GO
--Fecha Actual
SELECT CONVERT(CHAR(10), GetDate(), 103)
GO
--Columna Fecha
SELECT
'Fecha Venta: ' + CONVERT(CHAR (10), Fecha, 103) AS 'Convert con Style 103'
FROM #Venta
GO
--------------------------------
-- FUNCIONES DE FECHA --
--------------------------------
---------------------
-- Funci�n GETDATE
---------------------
--6 Devuelve la fecha actual
SELECT GETDATE()
GO
PRINT GETDATE()
GO
-----------------------------
-- Funci�n YEAR, MONTH, DAY
-----------------------------
--Active Northwind
USE Northwind
GO
-- Configuraci�n Ingl�s:
-- Ingreso de Fechas MDY
-- Inicio de D�as de Semana: Domingos=1, Lunes=2, ... S�bado=7
-- Configuraci�n Espa�ol:
-- Ingreso de Fechas DMY
-- Inicio de D�as de Semana: Lunes=1, Martes=2, ... Domingos=7
---------------------
-- Funci�n DATEPART
---------------------
-- D�a Actual
PRINT DATEPART(DAY, GETDATE())
GO
-- Mes Actual
PRINT DATEPART(MONTH, GETDATE())
GO
-- A�o Actual
PRINT DATEPART(YEAR, GETDATE())
GO
-- Trimestre
PRINT DATEPART (QUARTER, GETDATE())
GO
---------------------
-- Funci�n DATENAME
---------------------
---------------------
-- Funci�n DATEDIFF
---------------------
-- Diferencia en D�as
SELECT DATEDIFF(DAY,'28/07/2017','31/12/2018')
GO
-- Diferencia en Meses
SELECT DATEDIFF(MONTH,'28/07/2017','31/12/2018')
GO
-- Diferencia en A�os
SELECT DATEDIFF(YEAR,'28/07/2017','31/12/2018')
GO
-- Diferencia en Semanas
SELECT DATEDIFF(WEEK,'28/07/2017','31/12/2018')
GO
-- Diferencia en Trimestres
SELECT DATEDIFF(QUARTER,'28/07/2017','31/12/2018')
GO
INSERT #ABC
VALUES
('Juan', 'L�pez', '08/08/2008'),
('Jos�', 'Acevedo', '05/05/2005'),
('Mar�a', 'Sosa', '23/09/1999'),
('Jes�s', 'Montes', '31/07/2007'),
('Karla', 'Rosasco', '24/11/2004')
GO
--19
-- Liste Nombres y Apellidos indicando su Antig�edad
--A�o Solar:
-- Tiempo que tarda la Tierra en hacer un giro completo alrededor del Sol
-- referido al tiempo entre dos equinoccios.
-- Dura 365 d�as, 5 horas 48 minutos y 45.6 segundos.
--20
-- Modifique la consulta anterior para seleccionar usuarios
-- cuya antig�edad sea mayor a 10 a�os
SELECT Nombre, Apellido,
FLOOR(DATEDIFF(DAY, Fecha, GETDATE())/365.25) AS 'Antig�edad'
FROM #ABC
WHERE FLOOR(DATEDIFF(DAY, Fecha, GETDATE())/365.25)>10
GO
---------------------
-- Funci�n DATEADD
---------------------
-----------------------------------
-- Trabajando con la Fecha Actual
-----------------------------------
SELECT DATENAME(WEEKDAY,Getdate()),
DAY(Getdate()),
DATENAME(MONTH, Getdate()),
YEAR(GetDate())
GO
SELECT
'Hoy es ' + DATENAME(WEEKDAY,GetDate())
+' ' + CAST(DAY(GetDate()) AS VARCHAR(2))
+' de ' + DATENAME(MONTH, GetDate())
+' de ' + CAST(YEAR(GetDate()) AS CHAR(4))
AS 'Fecha Actual'
GO
SELECT
'Naciste un dia ' + DATENAME(WEEKDAY,'09/09/1999')
+' ' + CAST(DAY('09/09/1999') AS CHAR(2))
+' de ' + DATENAME(MONTH, '09/09/1999')
+' de ' + CAST(YEAR('09/09/1999') AS CHAR(4))
AS 'D�a de Nacimiento'
GO
--------------------------------
-- FUNCIONES DE CADENA --
--------------------------------
---------------------
-- Funci�n LEN
---------------------
---------------------
-- Funci�n RIGHT
---------------------
SELECT RIGHT(Apellido,2)
FROM #ABC
GO
---------------------
-- Funci�n SUBSTRING
---------------------
/*
Sintaxis:
SUBSTRING(Texto a trabajar, Posici�n Inicial , Nro. Caracteres a extraer)
*/
SELECT Apellido
FROM #ABC
WHERE SUBSTRING(Apellido,3,2)='EV'
GO
SELECT Apellido
FROM #ABC
WHERE SUBSTRING(Apellido,4,3)='TES'
GO
---------------------
-- Funci�n LOWER
-- Funci�n UPPER
---------------------
--35
-- Nombre en min�sculas y Apellido en may�sculas
SELECT LOWER(Nombre),UPPER(Apellido)
FROM #ABC
GO
---------------------
-- Autogenerado
---------------------
--36
/* Ejercicio
Generar el c�digo para cada usuario
Regla:
UNAC
GUION
2 PRIMERAS LETRAS NOMBRE
2 ULTIMOS DIGITOS A�O
3RA LETRA APELLIDO
TODO EN MAYUSCULAS
*/
SELECT
'UNAC-'+
UPPER(LEFT(Nombre,2) +
RIGHT(YEAR(Fecha),2) +
SUBSTRING(Apellido,3,1))
FROM #ABC
GO
-----------------------
-- Funci�n CHARINDEX
-----------------------
/*
Sintaxis:
CHARINDEX(Cadena_b�squeda, Texto_origen ,Inicio)
*/
---------------------
-- Funci�n REPLACE
---------------------
/*
Reemplaza una porci�n de texto por otra.
Sintaxis:
REPLACE(Texto_origen, Texto Antiguo, Texto Nuevo)
*/
---------------------
-- Funci�n STUFF
---------------------
/*
Elimina una longitud espec�fica de caracteres de un texto
e inserta otra cadena de caracteres especificando la posici�n de inicio.
Sintaxis:
STUFF (Texto_Original , Inicio , Longitud_Reemplazo , Cadena)
*/
-----------------------------
-- Funciones LTRIM y RTRIM
-----------------------------
--42 Retire los espacios en blanco al inicio y al final del siguiente texto
SELECT ' TEXTO '
GO
-----------------------
-- Funci�n SPACE
-----------------------
---------------------
-- Funci�n REVERSE
---------------------
-----------------------
-- Funci�n REPLICATE
-----------------------
SELECT REPLICATE('=',40)
GO
----------------------------------
-- Funciones ASCII y CHARACTER
----------------------------------
/*---------------------------------------
Profesor: Ing. F. Erick Tamayo
E-mail: f.erick.tamayo@gmail.com
Curso: Base de Datos
Sesi�n 5 TSQL
---------------------------------------*/
/*
__.............__
.--""``` ```""--.
':--..___ ___..--:'
\ ```"""""""``` /
.-` ___.....-----.....___ '-.
.:-""`` ~ ~ ``""-:.
/`-..___ ~ ~ ~___..-'\
/ ~ '`""---.........---""` \
; ;
; '::. ' ~ .:' _. ;
| '::: ' .:' ~ |
|~ .:' . _ ':. |
| .:' ':.~ |
| ':. . ~ . _ .: |
; '::. _ /|| .;' ;
; ': ( } \||D ;
\.:'.:':. | /\__,=_[_] /
\ ':. ~ |_\__ |----| ` /
'. '::.. _ | |/ |--. |_ ~ .'
'-._':' | /_ | | `'-_.-'
(``''--..._____...--''``)
`"--...__ __...--"`
`````
*/
-- Usaremos la BD Ventas
-- Importe la BD Ventas, por favor
USE Ventas
GO
-- Opci�n 1
SELECT * FROM Tb_Vendedor
WHERE DATENAME(WEEKDAY, Fec_ing) = 'Lunes'
OR DATENAME(WEEKDAY, Fec_ing) = 'Viernes'
GO
-- Opci�n 2
SELECT * FROM Tb_Vendedor
WHERE DATENAME(WEEKDAY, Fec_ing)
IN ('Lunes','Viernes')
GO
-- Traslado de datos
SELECT * INTO Vend FROM Tb_Vendedor
GO
-- Traslado de datos
SELECT * INTO ClientesEspeciales FROM Tb_Cliente
WHERE Cod_dis IN ('D04','D05','D26')
GO
-- 10a. Nombre
SELECT LEFT(Contacto, CHARINDEX(' ',Contacto)-1) AS 'Nombre'
FROM Tb_Cliente
GO
-- 10b. Apellido
SELECT RIGHT(Contacto, LEN(Contacto)-CHARINDEX(' ', Contacto)) AS 'Apellido'
FROM Tb_Cliente
GO
/*
Notas:
- Es m�s f�cil juntar que separar
Por eso tenga un nombre completo separado en columnas
- Y si lo debe tener todo junto, use un separador �nico, una coma, espacio, etc
dependiendo de cuantos elementos se tengan para separar
*/
/*
FUNCIONES DE AGREGACI�N
------------------------
SUM
COUNT
MAX
MIN
AVG
*/
----------------------------
-- Funci�n SUM
----------------------------
--11 Hallar el pago total (mensual) que se debe hacer a nuestros vendedores
----------------------------
-- Funci�n MAX, MIN
----------------------------
SELECT
MIN(Pre_pro) AS 'Precio M�nimo',
MAX(Pre_pro) AS 'Precio M�ximo'
FROM Tb_Producto
GO
SELECT
MIN(sue_ven) AS 'Sueldo M�nimo',
MAX(sue_ven) AS 'Sueldo M�ximo'
FROM Tb_Vendedor
WHERE tip_ven='1'
GO
----------------------------
-- Funci�n AVG
----------------------------
-- Hallando el promedio
SELECT AVG(FLOOR(DATEDIFF(DAY, fec_reg, GETDATE())/365.25)) AS 'Promedio
Antig�edad'
FROM Tb_Cliente -- Rpta: 15.15
GO
----------------------------
-- Funci�n COUNT
----------------------------
SELECT COUNT(Tel_cli)
FROM Tb_Cliente --Total Clientes con Tel�fono: 17
GO
-- Nota:
-- Count (y cualquier funci�n de agregaci�n) omite nulos cuando especificas alguna
columna
-- Con SELECT COUNT(*) FROM Tb_Cliente --Total Clientes: 20
-- Pero SELECT COUNT(Tel_cli) FROM Tb_Cliente --Total Clientes: 17
-- Count(*) nos da el n�mero de filas que retorna una consulta, sin importar nulos
o no nulos.
-- Pero si se especifica una columna COUNT(columna), entonces count retorna
-- el n�mero de filas en la cual la expresi�n no es null.
-- Primer intento
SELECT COUNT(Tel_cli) FROM Tb_Cliente
WHERE Tel_cli IS NULL --0 filas (?)
GO
-- Soluci�n 1
SELECT COUNT(*)-COUNT(Tel_cli)
FROM Tb_Cliente
GO
-- Soluci�n 2
SELECT COUNT(*) FROM Tb_Cliente
WHERE Tel_cli IS NULL --Rpta: 3
--Al utilizar COUNT(*) me refiero al total de registros
INSERT #Abc
VALUES
('Juan', '2000', '200'),
('Kathy', '1500', NULL),
('Sonia', '3000', '300')
GO
----------------------------
-- Funci�n ISNULL
----------------------------
-----------------------------------------
-- Agrupando con la Cl�usula GROUP BY
-----------------------------------------
INSERT #xyz
VALUES
('1'),
('1'),
('2'),
('2'),
('3')
GO
---------------------------------------------------------------
-- >> Nota:
-- Recuerde: un Group By muestra una fila por grupo,
-- mostrando el resultado de una funci�n de agregaci�n.
-- NO muestra el contenido del grupo.
---------------------------------------------------------------
/*---------------------------------------
Profesor: Ing. F. Erick Tamayo
E-mail: f.erick.tamayo@gmail.com
Curso: Base de Datos
Sesi�n 7 TSQL (3.5 hrs)
---------------------------------------*/
/*
, ,
$, $, ,
"ss.$ss. .s'
, .ss$$$$$$$$$$s,
$. s$$$$$$$$$$$$$$`$$Ss
"$$$$$$$$$$$$$$$$$$o$$$ ,
s$$$$$$$$$$$$$$$$$$$$$$$$s, ,s
s$$$$$$$$$"$$$$$$""""$$$$$$"$$$$$,
s$$$$$$$$$$s""$$$$ssssss"$$$$$$$$"
s$$$$$$$$$$' `"""ss"$"$s""
s$$$$$$$$$$, `"""""$ .s$$s
s$$$$$$$$$$$$s,... `s$$' `
`ssss$$$$$$$$$$$$$$$$$$$$####s. .$$"$. , s
`""""$$$$$$$$$$$$$$$$$$$$#####$$$$$$" $.$'
"$$$$$$$$$$$$$$$$$$$$$####s"" .$$$|
"$$$$$$$$$$$$$$$$$$$$$$$$##s .$$" $
$$""$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
$$" "$"$$$$$$$$$$$$$$$$$$$$S""""'
, ," ' $$$$$$$$$$$$$$$$####s
$. .s$$$$$$$$$$$$$$$$$####"
, "$s. ..ssS$$$$$$$$$$$$$$$$$$$####"
$ .$$$S$$$$$$$$$$$$$$$$$$$$$$$$#####"
Ss ..sS$$$$$$$$$$$$$$$$$$$$$$$$$$$######""
"$$sS$$$$$$$$$$$$$$$$$$$$$$$$$$$########"
, s$$$$$$$$$$$$$$$$$$$$$$$$#########""'
$ s$$$$$$$$$$$$$$$$$$$$$#######""' s' ,
$$..$$$$$$$$$$$$$$$$$$######"' ....,$$.... ,$
"$$$$$$$$$$$$$$$######"' , .sS$$$$$$$$$$$$$$$$s$$
$$$$$$$$$$$$#####" $, .s$$$$$$$$$$$$$$$$$$$$$$$$s.
) $$$$$$$$$$$#####' `$$$$$$$$$###########$$$$$$$$$$$.
(( $$$$$$$$$$$##### $$$$$$$$###" "####$$$$$$$$$$
) \ $$$$$$$$$$$$####. $$$$$$###" "###$$$$$$$$$
( ) $$$$$$$$$$$$$####. $$$$$###" ####$$$$$$$$$
) ( ( $$"$$$$$$$$$$$#####.$$$$$###' .###$$$$$$$$$$
( ) ) _,$" $$$$$$$$$$$$######.$$##' .###$$$$$$$$$$
) ( ( \. "$$$$$$$$$$$$$#######,,,. ..####$$$$$$$$$$$"
( )$ ) ) ,$$$$$$$$$$$$$$$$$$####################$$$$$$$$$$$"
( ($$ ( \ _sS" `"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$S$$,
) )$$$s ) ) . . `$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"' `$$
( $$$Ss/ .$, .$,,s$$$$$$##S$$$$$$$$$$$$$$$$$$$$$$$$S"" '
\)_$$$$$$$$$$$$$$$$$$$$$$$##" $$ `$$. `$$.
`"S$$$$$$$$$$$$$$$$$#" $ `$ `$
`"""""""""""""' ' ' '
*/
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- I - SUBCONSULTA (SUBQUERY)
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
USE Ventas
GO
-- "Una funci�n de agregaci�n (SUM, AVG, COUNT, MAX, MIN) no puede estar
-- en una cl�usula WHERE a no ser que est� incluida como Subconsulta (Subquery)"
-- �xito
SELECT Des_pro, Pre_pro
FROM Tb_Producto
WHERE Pre_pro>=(SELECT AVG(Pre_pro) FROM Tb_Producto)
GO
sp_help Tb_vendedor
GO -- Money tiene escala a 4 decimales
SELECT COUNT(*)
FROM Tb_Factura
WHERE Num_fac IN (SELECT Num_fac
FROM Tb_Detalle_Factura
GROUP BY Num_fac
HAVING SUM(Can_ven*Pre_ven)>1000)
GO
FROM Tb_Cliente
GO
--Por ejemplo, para el Cliente C016 su primera factura
--es del 16 de Enero del 2010 y para el Cliente C019 la
--primera factura es 16 de Septiembre del 2010
-- Comprobando
SELECT * FROM TB_FACTURA
WHERE Cod_cli='C016' OR Cod_cli='C019'
ORDER BY Cod_cli
GO
(SELECT COUNT(*)
FROM Tb_Factura
WHERE Tb_Cliente.Cod_cli=Tb_Factura.Cod_cli
) AS 'Nro. de Facturas'
FROM Tb_Cliente
GO
(SELECT COUNT(*)
FROM Tb_Factura
WHERE Tb_Cliente.Cod_cli=Tb_Factura.Cod_cli
) AS 'Nro. de Facturas'
FROM Tb_Cliente
-- 15
CASE
FROM Tb_Vendedor
--COMPUTE AVG(sue_ven)
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- III - JOINS
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
----------------------
-- \ INNER JOIN \ --
----------------------
-- Sin Alias
-- Con Alias
-- 19
-- Mostrar una lista de Productos con sus respectivos Proveedores
/*---------------------------------------
Profesor: Ing. F. Erick Tamayo
E-mail: f.erick.tamayo@gmail.com
Curso: Base de Datos
Sesi�n 8 TSQL
---------------------------------------*/
/*
,-----.
\======'.
\ {} '.
\ \/ V '.
\ || | '._ _,cmmmnc,_
\___68FS___\'-._=----+- _______________,.-=:3H)###C-- `c._
:|=--------------`---"'`. ` `. `. `, `~""==="~` `'-.___
,dH] ' =(*)= : ---==;=--; . ; +-- -_ .-`
:HH]_:______________ ____,.........__ _____,.----=-"~ `
;:""'"'----._.------\` : . `.'`'"'"'"P
|: .-'==-.__)___\. : . .'`___L~___(
|: _.'` '| / \.: . .-`""`
`'"' `--' \: ._.-'
}_`============>-
*/
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- I- JOINS
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
USE Joins
GO
INSERT Clientes
VALUES
('1', 'Juli�n', 'Castillo', 'Av. Sol 123', 'Lima'),
('2', 'Melissa', 'Saucedo', 'Jr. Luna 99', 'Lima'),
('3', 'Laura', 'Paz', 'Calle Astral 77', 'Callao'),
('4', 'Helen', 'Deza', 'Psje. Universo 444', 'Lima')
GO
INSERT Pedidos
VALUES
('1', 'PC', '3'),
('2', 'Laptop', '3'),
('3', 'TV', '1'),
('4', 'Equipo', '1'),
('5', 'Blu-Ray', '7')
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- II- Ejercicios Joins
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
USE VENTAS
GO
-- Totalizar
SELECT P.Cod_pro, P.Des_pro, SUM(DF.Can_ven) AS 'Items vendidos'
FROM Tb_Detalle_Factura DF
INNER JOIN Tb_Producto P ON DF.Cod_pro=P.Cod_pro
GROUP BY P.Cod_pro, P.Des_pro
ORDER BY P.Cod_pro
GO
SELECT *
FROM Tb_Detalle_Factura DF
INNER JOIN Tb_Producto P
ON DF.Cod_pro=P.Cod_pro
GO
-- Muestra ambas Tablas del Join, comparadas una
-- al lado de la otra.
SELECT *
FROM Tb_Producto P
LEFT JOIN Tb_Detalle_Factura DF
ON DF.Cod_pro=P.Cod_pro
WHERE DF.Num_fac IS NULL
GO
SELECT *
FROM Tb_Detalle_Factura DF
RIGHT JOIN Tb_Producto P ON DF.Cod_pro=P.Cod_pro
WHERE DF.Num_fac IS NULL
GO
--Luego la negaci�n
USE Zonas
GO
INSERT Ventas_Este
VALUES
('1', 'Juan', '3500'),
('2', 'Pedro', '1500'),
('3', 'Karla', '7000'),
('4', 'Miguel', '4000'),
('5', 'Pamela', '2800')
GO
INSERT Ventas_Sur
VALUES
('1', 'Laura', '4000'),
('2', 'Manuel', '900'),
('3', 'Dana', '8300'),
('4', 'Pamela', '750'),
('5', 'Lizeth', '2800'),
('6', 'Gladys', '3200'),
('7', 'Karla', '3200')
GO
INSERT Ventas_Oeste
VALUES
('1', 'Gisela', '4000'),
('2', 'C�sar', '900'),
('3', 'Juan', '8300'),
('4', 'Pamela', '7200')
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- III - UNION
-- Une los resultados de dos o m�s SELECT en un
-- solo conjunto de resultados.
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- Regla General:
-- > Cada select debe tener el mismo n�mero de columnas.
-- > Las columnas de cada tabla deben tener similar tipo de dato.
-- > Las columnas referenciadas deben estar en el mismo orden.
-- 13
SELECT Vendedor FROM Ventas_Este
UNION
SELECT Vendedor FROM Ventas_Sur
GO -- En lugar de 12, salen 10, debido a que
-- Pamela y Karla tienen ventas registradas
-- en ambas zonas
-- 14
SELECT Vendedor FROM Ventas_Este
UNION ALL
SELECT Vendedor FROM Ventas_Sur
GO -- Salen los 12 registros, incluidas las ventas
-- de Pamela y Karla para ambas zonas.
-- 15
-- Si incluyo un campo adicional (por ejemplo el campo Monto),
-- la b�squeda se har�a con la dupla Vendedor/Monto la cual no tiene repeticiones
-- y har�a innecesaria la utilizaci�n de la cl�usula ALL si es que quiero ver
-- los 12 registros ya que Pamela y Karla tienen diferentes ventas en ambas zonas.
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- IV - INTERSECT
-- Presenta los resultados que se repiten en cada
-- uno de los SELECT.
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- Regla General:
-- > Cada select debe tener el mismo n�mero de columnas.
-- > Las columnas de cada tabla deben tener similar tipo de dato.
-- > Las columnas referenciadas deben estar en el mismo orden.
-- 16
SELECT Vendedor FROM Ventas_Este
INTERSECT
SELECT Vendedor FROM Ventas_Sur
GO
-- 17
SELECT Vendedor FROM Ventas_Este
INTERSECT
SELECT Vendedor FROM Ventas_Sur
INTERSECT
SELECT Vendedor FROM Ventas_Oeste
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- V - EXCEPT
-- Presenta los resultados de la Primera Tabla
-- que no figuran en la Segunda o sucesivas Tablas.
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- Regla General:
-- > Cada select debe tener el mismo n�mero de columnas.
-- > Las columnas de cada tabla deben tener similar tipo de dato.
-- > Las columnas referenciadas deben estar en el mismo orden.
-- 18
SELECT Vendedor FROM Ventas_Este
EXCEPT
SELECT Vendedor FROM Ventas_Sur
GO -- Resultados:
-- Juan
-- Miguel
-- Pedro
-- 19
SELECT Vendedor FROM Ventas_Este
EXCEPT
SELECT Vendedor FROM Ventas_Sur
EXCEPT
SELECT Vendedor FROM Ventas_Oeste
GO -- Resultados:
-- Miguel
-- Pedro
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- VI - Vistas
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- Ventaja:
-- El usuario accede a la data apropiada para �l.
-- Con esto limitamos el acceso a data sensible.
-- Restricciones:
-- > No se puede definir una vista con ORDER BY, COMPUTE o SELECT INTO.
-- > No se puede hacer referencia a tablas temporales.
USE VENTAS
GO
-- A)
SELECT * FROM VW_ProductosEspeciales
GO
-- B)
SELECT * FROM VW_ProductosEspeciales WHERE Des_pro LIKE 'F%'
GO
-- C)
SELECT * FROM VW_ProductosEspeciales ORDER BY Des_pro ASC
GO
-- 21
-- Modificaremos la vista para que tambi�n excluya al distrito de San Miguel
-- 22 WITH ENCRYPTION
-- Encriptar la Vista
sp_helptext VW_TotalporFactura
GO -- El c�digo es visible
-- ya que la vista no est� encriptada.
sp_helptext VW_ProductosEspeciales
GO
-- El c�digo no es visible
-- ya que la vista est� encriptada.
sp_depends VW_TotalporFactura
GO
sp_depends VW_ProductosEspeciales
GO
sp_depends Tb_Detalle_Factura
GO
USE Zonas
GO
INSERT Clientes
VALUES
('1', 'Carla', 'A'),
('2', 'Hugo', 'C'),
('3', 'Paco', 'B'),
('4', 'Luis', 'A'),
('5', 'Diana', 'A'),
('6', 'Alberto', 'B'),
('7', 'Jenny', 'C'),
('8', 'Juan', 'C'),
('9', 'Melissa', 'A')
GO
INSERT VW_ClientesAC
VALUES
('10', 'Laura', 'B')
GO -- La Vista lo permite, pero lo ideal
-- es que no lo haga, ya que esta Vista s�lo
-- trabaja con Clientes con Estado 'A' o 'C'
-- Haremos que la Vista trabaje para todos los casos s�lo con Estados 'A' y 'C'
-- Esto lo conseguimos con la Cl�usula WITH CHECK OPTION
INSERT VW_ClientesAC
VALUES
('11', 'Tom', 'B')
GO
-- 29 Mostrar todas las Vistas de una Base de Datos
USE Ventas
GO
/*
_____|\
_.--| X |:
<____|.----||
.---''---,
;..__..' _...
,'/ ;|/..--'' \
,'_/.-/': :
_..-'''/ / | \ \ _|/|
\ /-./_ \; \ \,;' \
,\ / \: `:\ \ // `:`.
,' \ /-._; | : : :: ,. .
,' :: /`-._| | | || ' : `.`.)
_,' |;._:: | | | | `| : `'
,' `. / |`-:_ ; | | | : \
`--. ) /|-._: : | \ \
/ / :_| ;`-._; __..--'; : :
/ ( ;|;-./_ _/.-:'o | / ' |
/ , \._/_/_./--''/_|:|___|_,' |
: / `'-'--'----'---------' |
| : O ._O O_. O ._O O_. ; ;
: `. // // // // ,' /
~~ ~~~`.______//____//____//____//_______,'~ ~~ ~~
~~ // //~ // // ~~ ~~ ~~
~~ ~~ _// _// _// ~ _// ~ ~ ~ ~
~ / / / / / / / / ~ ~~ ~~ ~~
~~~ ~~~ ~~~ ~~~ ~~ ~~ ~~
*/
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- I - Programaci�n
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
/* Parte 1:
---------
Manejo de Variables Locales
----------------------------
-- Salida de resultados
PRINT 'Fecha de evaluaci�n: '+ CAST(GETDATE() AS Varchar(20))
PRINT 'El promedio es: ' + CAST(@Prom AS Varchar(5))
GO
-- Salida de resultados
PRINT 'Fecha de evaluaci�n '+ CAST(GETDATE() AS Varchar(20))
PRINT 'El promedio es: ' + CAST(@Prom AS Varchar(5))
GO
-- Se debe proporcionar :
-- > El Precio.
-- > La Cantidad a comprar.
-- Salida:
-- Fecha
-- Subtotal
-- IGV
-- T O T A L
-- Proceso
SET @Subtotal=(@Precio*@Cantidad)
SET @Igv=(@Subtotal*0.18)
SET @Total=(@Subtotal+@Igv)
-- Salida de resultados
PRINT 'Fecha de compra: '+ CAST(Getdate() AS Varchar(20))
PRINT 'El Subtotal es: '+CAST(@Subtotal AS Varchar(10))
PRINT 'El Igv del 18% es: '+CAST(@Igv AS Varchar(10))
PRINT 'El Total es: '+ CAST(@Total AS Varchar(10))
GO
-- Parte 2: Usando IF
------------------------
--3 Escribir un programa que permita calcular el promedio de dos notas enteras.
-- Mostrar el mensaje 'Aprobado' si el promedio es mayor o igual que 11.
-- En caso contrario mostrar 'Desaprobado'.
IF(@Prom>=11)
BEGIN
SET @Msj='Aprobado'
END
ELSE
BEGIN
SET @Msj='Desaprobado'
END
-- Salida de resultados
PRINT 'Fecha de evaluaci�n '+ CAST(GETDATE() AS Varchar(20))
PRINT 'El promedio es: ' + CAST(@Prom AS Varchar(5))
PRINT 'Condici�n: ' + @Msj
GO
USE VENTAS
GO
-- 4 Contar Distritos
SELECT COUNT(*) FROM Tb_Distrito
GO
--
DECLARE @NumDis INT
SET @NumDis=(SELECT COUNT(*) FROM Tb_Distrito)
PRINT 'Tenemos '+ Convert(Varchar(10), @NumDis)+ ' distritos'
GO
-- 5 Contar Clientes
SELECT COUNT(*) FROM Tb_Cliente
GO
--
DECLARE @NumCli INT
SET @NumCli=(SELECT COUNT(*) FROM Tb_Cliente)
PRINT 'Tenemos '+ Convert(Varchar(10),@NumCli)+ ' clientes'
GO
--Declaraci�n de Variables
DECLARE @SumaMontoFacturas INT
--Salida de Resultados
PRINT 'El Monto Total facturado es: ' + Convert(Varchar(10), @SumaMontoFacturas)
GO
--Declaraci�n de Variables
DECLARE @OC INT
DECLARE @Codprv CHAR(4)
--Salida de Resultados
PRINT 'La cantidad de �rdenes de Compra atendidas por el Proveedor '
+ CAST(@Codprv AS Char(4)) + ' es: '+ CAST(@OC AS Varchar(2))
GO
--Declaraci�n de Variables
DECLARE @Deuda Smallmoney
DECLARE @Codcli Char(4)
--Asignamos Valores
SET @Codcli='C015'
SET @Deuda= (SELECT SUM(DF.Can_ven*DF.Pre_ven)
FROM Tb_Factura F
INNER JOIN Tb_Detalle_Factura DF
ON DF.Num_fac=F.Num_fac
WHERE F.cod_cli=@codcli AND F.est_fac='1')
--Imprimir la deuda
Print 'La deuda del cliente '+ @Codcli +
' es: ' + Convert(varchar(10),@Deuda)
GO
--Declaraci�n de Variables
DECLARE @Deuda Smallmoney
DECLARE @Codcli Char(4)
--Asignamos Valores
SET @Codcli='C001'
SET @Deuda= (SELECT SUM(DF.Can_ven*DF.Pre_ven)
FROM Tb_Factura F
INNER JOIN Tb_Detalle_Factura DF
ON DF.Num_fac=F.Num_fac
WHERE F.cod_cli=@codcli AND F.est_fac='1')
-- Proceso
IF @Deuda IS Null
Begin
SET @Deuda=0
End
--Imprimir la deuda
PRINT 'La deuda del cliente '+ @Codcli +
' es: ' + CONVERT(Varchar(10), @Deuda)
GO
--Declaraci�n de Variables
DECLARE @Deuda Smallmoney
DECLARE @Codcli Char(4)
--Asignamos Valores
SET @Codcli='C001'
SET @Deuda= (SELECT SUM(DF.Can_ven*DF.Pre_ven)
FROM Tb_Factura F
INNER JOIN Tb_Detalle_Factura DF
ON DF.Num_fac=F.Num_fac
WHERE F.cod_cli=@codcli AND F.est_fac='1')
-- [9c]
-- La clase pasada se implement� una Vista que hallaba el
-- Total de Facturas para un Cliente Deudor.
-- Si no la tiene, ejec�tela a continuaci�n.
-- VW_TotalFacturaporClienteDeudores
--Declaraci�n de Variables
DECLARE @Deuda Money
DECLARE @Codcli Char(4)
--Asignamos Valores
Set @Codcli='C001'
Set @Deuda= (SELECT Totales
FROM VW_TotalFacturaporClienteDeudores
WHERE Cod_cli=@Codcli)
-- 10
-- Calcule e imprima la Antig�edad de los Clientes.
-- Si es mayor o igual a 10 a�os imprima 'Cliente Antig�o' de lo contario
-- 'Cliente Nuevo'
--Declaraci�n de Variables
DECLARE @Antiguedad INT
DECLARE @Cod_cli CHAR(4)
--Asignamos Valores
SET @Cod_cli = 'C013'
SET @Antiguedad = (SELECT FLOOR(DATEDIFF(DAY, Fec_reg, GETDATE())/365.25)
FROM Tb_cliente
WHERE @Cod_cli=Cod_cli)
--Salida de Resultados
PRINT 'La Antig�edad del Cliente es de '+ CAST(@Antiguedad AS Varchar(2))+ ' a�os.'
IF @Antiguedad >=10
Begin
PRINT 'El Cliente '+ @Cod_cli + ' es un Cliente Antiguo'
End
ELSE
Begin
PRINT 'El Cliente '+ @Cod_cli + ' es un Cliente Nuevo'
End
GO
-- 11
-- Determine la sgte regla de negocio para una determinada factura
-- (almacene el n�mero de factura en una variable):
--
-- Si se cancel� (Estado 2) en un tiempo menor o igual a 10 d�as:
-- > Si el Monto es menor a 120, el descuento ser� el 10% del monto
-- > En caso contrario, el descuento ser� del 15%
--
-- Si se cancel� luego de 10 d�as:
-- > No se aplica descuento
-- Con la factura F019 debe salir cero, con la F008 sale 370.20, etc
-- Declaraci�n de variables
DECLARE @Num_fac CHAR(5)
DECLARE @Tiempo INT
DECLARE @Total DECIMAL(8,2), @Dcto DECIMAL(8,2)
--Asignaci�n de Variables
SET @Num_fac ='FA019'
--C�lculos
SET @Tiempo= (SELECT DATEDIFF (DAY, Fec_fac, Fec_can)
FROM Tb_Factura
WHERE Num_fac=@Num_fac AND Est_fac='2')
IF @Tiempo<=10
--Aplicamos descuento
Begin
SET @Total=(SELECT SUM(Can_ven*Pre_ven)
FROM Tb_Detalle_Factura
WHERE Num_fac=@Num_fac
GROUP BY Num_fac)
IF @Total <120
Begin
SET @Dcto=@Total*0.1
End
ELSE
Begin
SET @Dcto=@Total*0.12
End
End
ELSE
Begin
-- No hay descuento
SET @Dcto=0
End
--Imprimir
Print 'El descuento es : ' + Convert(Varchar(10), @Dcto)
GO
WHILE (@Num)<=100
Begin
PRINT 'El n�mero es: '+CONVERT(Varchar(3),@Num)
SET @Num=@Num+1
End
GO
WHILE (@Num)<=100
Begin
PRINT 'El n�mero es: '+CONVERT(Varchar(3),@Num)
SET @Num=@Num+1
IF @Num=17
Begin
BREAK
End
End
GO
Set @Valor=1
Set @Suma=0
WHILE @Valor<=100
Begin
SET @Suma=@Suma+@valor
SET @Valor=@valor+1
Print @Suma
End
SELECT ' La sumatoria de los primeros 100 numeros es: ', @suma
GO
SET @Numero=20
SET @Valor=1
SET @Factorial=1
WHILE @Valor<=@Numero
Begin
SET @Factorial=@Factorial*@Valor
SET @Valor=@Valor+1
End
SELECT ' El factorial de ' + Convert(Varchar(4), @Numero) + ' es: ', @Factorial
GO
UPDATE Mercader�a
SET Pre_pro=Pre_pro*1.25
WHERE Pre_pro<@Prom
GO
SELECT RAND()*5
GO --Ej: 0.45, 1.23, 3.7, 4.95, etc.
--Por eso sumamos UNO para asegurarnos que se llegue a 5 y no sea menor a 1.
SELECT RAND()*5+1
GO -- Nunca saldr� un n�mero menor a 1 y ya aparece 5, pero
-- tambi�n aparecer� valores como 5.70, 5.98, etc.
SET @Contador=1
WHILE @Contador<=50
Begin
SET @Registrorandom = FLOOR(RAND()*1000 + 1)
INSERT #Usuarios
VALUES(@Registrorandom)
SET @Contador=@Contador+1
End
GO
-- Comprobamos
SELECT * FROM #Usuarios
GO
--Limitarlos del 1 al 10
SELECT ABS(CHECKSUM(NEWID())) % 10+1
GO
--Limitarlos del 1 al 50
SELECT ABS(CHECKSUM(NEWID())) % 50+1
GO
SET @Contador=1
WHILE @Contador<=50
Begin
SET @Registrorandom = ABS(CAST(NEWID() AS BINARY(6)) % 1000) + 1
INSERT #Usuarios2
VALUES(@Registrorandom)
SET @Contador=@Contador+1
End
GO
-- Comprobamos
SELECT * FROM #Usuarios2
GO
USE Ventas
GO
PRINT
'Hoy ' + DATENAME(weekday, getdate())+' '
+ CAST(DATEPART(DAY,getdate()) as VARCHAR(2))+' de '
+ DATENAME(MONTH, getdate())+' del '
+ CAST(DATEPART(YEAR,getdate()) AS CHAR(4))
--Actualizamos
UPDATE Productos
SET PRE_PRO = PRE_PRO * 1.25
END
GO
--22
BEGIN CATCH
PRINT 'No est� definida la divisi�n por cero'
END CATCH
GO
BEGIN CATCH
PRINT ERROR_NUMBER()
PRINT ERROR_MESSAGE()
END CATCH
GO
-- 24
BEGIN CATCH
PRINT 'Tenemos el error: ' + CAST(Error_Number() AS VARCHAR(5))
PRINT Error_Message()
End CATCH
GO
BEGIN CATCH
PRINT 'Tenemos el error: ' + CAST(Error_Number() AS VARCHAR(5))
PRINT Error_Message()
End CATCH
GO
-- 25
Sp_helpconstraint Abastecimientos
GO
BEGIN CATCH
IF ERROR_NUMBER() = 515
PRINT 'Algunas columnas no admiten nulos'
ELSE
IF ERROR_NUMBER() = 8152
PRINT 'Se ha sobrepasado el tama�o de un campo'
ELSE
PRINT 'Error por Integridad Referencial'
END CATCH
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- III- Funciones
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
/* Funciones Creadas por SQL
-------------------------
Deterministas:
Las funciones deterministas devuelven siempre el mismo resultado
cada vez que se invocan con un conjunto espec�fico de valores de entrada
y cuando el estado de la base de datos es el mismo.
No Deterministas:
Las funciones no deterministas pueden devolver resultados diferentes
cada vez que se llaman con un conjunto espec�fico de valores de entrada
aunque el estado de la base de datos a la que tienen acceso
permanezca sin cambios.
-- FUNCIONES ESCALARES
-- Da un solo resultado por registro
DECLARE
@A�o INT,
@Bisiesto VARCHAR(11)
RETURN @Bisiesto
END
GO
-- Probando
SELECT dbo.EsBisiesto('10/10/2000')
SELECT dbo.EsBisiesto('01/01/2003')
GO
SELECT
DATEADD(dd,-(DAY('11/08/2013')-1),'11/08/2013')
GO
-- Probando
SELECT dbo.uf_PrimerDiaMes('04/06/2008')
SELECT dbo.uf_PrimerDiaMes('17/10/2009')
GO
-- 29 Una funci�n que nos de el �ltimo d�a del mes de una fecha
RETURN @Fecha_resp
END
GO
-- Probando
SELECT dbo.uf_UltimoDiaMes('04/06/2008')
SELECT dbo.uf_UltimoDiaMes('17/10/2009')
SELECT dbo.uf_UltimoDiaMes('02/02/2010')
SELECT dbo.uf_UltimoDiaMes('02/02/2012')
GO
-- 30 Una funci�n que nos de el Fin de mes (en letras) de una fecha dada
BEGIN
DECLARE @Nombre VARCHAR(30)
SET @Nombre=
CASE DATENAME(MONTH, @Fecha)
WHEN 'Enero' THEN ('31 de Enero')
WHEN 'Febrero' THEN
CASE
WHEN dbo.EsBisiesto(@Fecha)='No Bisiesto' THEN('28 de
Febrero')
ELSE '29 de Febrero'
END
WHEN 'Marzo' THEN ('31 de Marzo')
WHEN 'Abril' THEN ('30 de Abril')
WHEN 'Mayo' THEN ('31 de Mayo')
WHEN 'Junio' THEN ('30 de Junio')
WHEN 'Julio' THEN ('31 de Julio')
WHEN 'Agosto' THEN ('31 de Agosto')
WHEN 'Septiembre' THEN ('30 de Septiembre')
WHEN 'Octubre' THEN ('31 de Octubre')
WHEN 'Noviembre' THEN ('30 de Noviembre')
WHEN 'Diciembre' THEN ('31 de Diciembre')
END -- End del Case
RETURN @Nombre
END
GO
-- Probando
SELECT dbo.uf_FinMesLetras('04/06/2008')
SELECT dbo.uf_FinMesLetras('17/10/2009')
SELECT dbo.uf_FinMesLetras('02/02/2010')
SELECT dbo.uf_FinMesLetras('02/02/2012')
GO
/*---------------------------------------
Profesor: Ing. F. Erick Tamayo
E-mail: f.erick.tamayo@gmail.com
Curso: Base de Datos
Sesi�n 10 TSQL
---------------------------------------*/
/*
/~ ~\
|_ |
|/ __-__
\ /~ ~~-_
~~ -~~\ ~\
/ | \
, / / \
// _ _---~~~ //-_ \
/ (/~~ ) _____/-__ ~-_ _-\ _________
/ _-~\\0) ~~~~ ~~-_ \__--~~ `\ ___---~~~ /'
/_-~ _-/' )~/ /'
(___________/ _-~/' _-~~/ _-~
_ ----- _~-_\\\\ _-~ /' __--~ (_ ______---~~~--_
_-~ ~-_~\\\\ ( ( -_~ ~-_ | ~-_
/~~~~\ \ \~~ ~-_ ~-_ ~\ ~~--__-----_ \
; / \ ______-----\ ~-__~-~~~~~~--_ ~~--_ \ .
| | \((*)~~~~~~~~~~| __--~~ ~-_ ) | |
| \ |~|~---------)__--~~ \_____________/ / ,
\ ~-----~ / /~ ) \ ~-----~ /
~-_ _-~ /_______________________________/ `-_ _-~
~ ----- ~ ~ ----- ~
*/
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- I- Seguimos con las Funciones
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
USE VENTAS
GO
-- Probando la Funci�n
SELECT dbo.uf_CalcularFactura('FA007')
GO
-- 02 Crear una Funci�n que nos muestre el Nombre del Cliente y su RUC
RETURN @Com
End
GO
-- Probando la Funci�n
SELECT dbo.ObtenerComision(400) --Menos de 500. Su 5% es 20.
SELECT dbo.ObtenerComision(1000) --Menos de 1200. Su 10% es 100.
SELECT dbo.ObtenerComision(2000) --De 1200 en adelante. Su 15% es 300.
GO
IF @Monto<500
SET @Com=@Monto*0.05
ELSE
IF @Monto<1200
SET @Com=@Monto*0.1
ELSE
SET @Com=@Monto*0.15
RETURN @Com
End
GO
-- Probando la Funci�n
SELECT dbo.ObtenerComision2('V01')
GO
-- Reutilizando Funciones
CREATE FUNCTION ObtenerComision3(@cod_ven CHAR(3))
RETURNS MONEY
AS
Begin
DECLARE @Com MONEY
DECLARE @Monto MONEY
RETURN @Com
End
GO
-- Probando la Funci�n
SELECT dbo.ObtenerComision3('V01')
GO
Begin
DECLARE @Deuda MONEY
IF @Deuda IS NULL
SET @Deuda=0
RETURN @Deuda
END
GO
-- Probando la Funci�n
SELECT Cod_cli, Raz_soc_cli, dbo.CalcularDeuda(Cod_cli) AS 'Deuda'
FROM Tb_Cliente
WHERE dbo.calcularDeuda(Cod_cli)>0
GO
-- Creando la Funci�n
CREATE FUNCTION uf_MejorPrecioAbas (@Cod_pro CHAR(4))
RETURNS MONEY
AS
Begin
DECLARE @Aba MONEY
IF @Aba is null
SET @Aba =0
RETURN @Aba
End
GO
-- Probando la Funci�n
SELECT Cod_pro, Des_pro, Pre_pro AS 'Precio Venta',
dbo.uf_MejorPrecioAbas(Cod_pro) AS 'Mejor Precio Abast.'
FROM Tb_Producto
GO
-- PrimerDiaMes
CREATE FUNCTION uf_PrimerDiaMes(@Fecha_ingr DATE)
RETURNS DATE
AS
BEGIN
DECLARE @Fecha_resp DATE
SET @Fecha_resp=DATEADD(dd,-(DAY(@Fecha_ingr)-1),@Fecha_ingr)
RETURN @Fecha_resp
END
GO
--UltimoDiaMes
CREATE FUNCTION uf_UltimoDiaMes(@Fecha_ingr DATE)
RETURNS DATE
AS
BEGIN
DECLARE @Fecha_resp DATE
SET @Fecha_ingr= dbo.uf_PrimerDiaMes(@Fecha_ingr)
SET @Fecha_resp = DATEADD(Day, -1, DATEADD(Month, 1, @Fecha_ingr))
RETURN @Fecha_resp
END
GO
Begin
DECLARE @Compra MONEY
IF @Compra IS NULL
SET @Compra=0
Return @Compra
End
GO
--Establecemos
SET DATEFORMAT DMY
GO
-- Probando la Funci�n
SELECT Cod_cli, dbo.CalcularCompras(cod_cli, '05/01/2010') AS 'Total'
FROM Tb_Factura
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- II- Manejo de Transacciones
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
/*
Una transacci�n es un conjunto de modificaciones de datos
que deben ser procesados como una unidad.
-- MANEJO DE BATCHS
-- 08 PruebaBatch
--A)
CREATE TABLE PruebaBatch(
ColA INT,
ColB CHAR(3) NOT NULL
)
GO
-- 09 PruebaBatch2
-- Cancelaremos la transacci�n
ROLLBACK TRANSACTION
GO
-- Nota:
-- Obligatoriamente Toda Transacci�n debe terminar con:
-- > ROLLBACK TRANSACTION: Si es que la vamos a deshacer.
-- > COMMIT TRANSACTION: Si es que la vamos a confirmar.
-- 10 PruebaBatch3
-- Cancelaremos la transacci�n
ROLLBACK TRANSACTION
GO
-- 11 Batch4
-- Cancelaremos la transacci�n
ROLLBACK TRANSACTION
GO
/*
*/
-- TRANSACCIONES EXPL�CITAS
INSERT Facturas
VALUES ('FA050','02/05/2008','C001','02/06/2008','2','V02',0.19)
Error_Capturado:
RollBack Transaction
GO
-- Veamos
SELECT * FROM Facturas
GO
Begin Try
Begin Transaction
INSERT Facturas
VALUES ('FA070','02/05/2008','C001','02/06/2008','2','V02',0.19)
Commit Transaction
Print 'Factura Insertada'
End Try
Begin Catch
RollBack Transaction
Print 'Tenemos el error ' + CAST(Error_number() AS VARCHAR(5))
+ ': '+ Error_message()
Print 'No se insert� ni la cabecera ni los detalles'
End Catch
GO
Begin Try
Begin Transaction
Insert Productos values ('P092','Calculadora',50,30,10,'UNI','1',0)
Insert Abastecimientos values('V001','P090',98.5)
Insert Abastecimientos values('V007','P090',99)
Insert Abastecimientos values('V045','P090',96.8)
Commit Transaction
Print 'Producto Insertado'
End Try
Begin Catch
RollBack Transaction
Print 'Tenemos el error ' + CAST(error_number() AS VARCHAR(5))
+ ': '+ error_message()
Print 'No se insert� el producto ni sus proveedores'
End Catch
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- III- Procedimientos Almacenados
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
/*
Un Procedimiento Almacenado (Stored Procedure) es un Programa
(o Procedimiento) el cual es almacenado f�sicamente en una Base de Datos.
> Seguridad: Otra ventaja que tienen es que permiten aplicar un esquema
de seguridad mas potente, haciendo que los usuarios que usen nuestra aplicaci�n,
s�lo tengan permisos para ejecutar procedimientos almacenados y no a todos los
objetos de la base. De esta forma si un hacker encuentra una vulnerabilidad
(SQL Injection) en nuestra aplicaci�n, no podra explotarla ejecutando comandos SQL
directamente sobre la base, ya que el usuario con el cual se ejecuta la aplicaci�n
s�lo tiene derecho a la ejecucion de los procedimientos almacenados en la
base de datos.
*/
Begin
SELECT Num_Fac, Fec_fac, Fec_can,
dbo.uf_CalcularFactura(Num_Fac) AS 'Total'
FROM Tb_Factura
WHERE Cod_cli=@CodCli
End
GO
Begin
SELECT Num_Fac, Fec_fac,
IsNull(CAST(Fec_can AS VARCHAR(30)), 'No cancel� a�n'),
dbo.uf_CalcularFactura(Num_Fac) AS 'Total'
FROM Tb_Factura
WHERE Cod_cli=@CodCli
End
GO
-- �Podr�a hacer que las que son fechas se vean como fechas y los null
-- con el correspondiente mensaje?
---------------------------------
--/SQL VARIANT/--
---------------------------------
--Al sumar
SELECT SUM(Dato) FROM Variedad
GO
--Al contar
SELECT COUNT(Dato) FROM Variedad
GO
--Sobre la Suma
SELECT SUM(CAST(Dato AS DECIMAL(10, 2)))
FROM Variedad
WHERE Sql_Variant_Property(Dato, 'Basetype')
IN ('Int', 'Smallint', 'Tinyint', 'Bigint', 'Decimal', 'Numeric', 'Float')
GO
-- Resolviendo lo solicitado
Begin
SELECT Num_Fac, Fec_fac,
CASE
WHEN Fec_can IS NULL
THEN IsNull(CAST(Fec_can AS SQL_VARIANT), 'No cancel� a�n')
ELSE Fec_can
END AS 'Cancelaci�n',
dbo.uf_CalcularFactura(Num_Fac) AS 'Total'
FROM Tb_Factura
WHERE Cod_cli=@CodCli
End
GO
-- Importado=1, Nacional=0
-- Update M�ltiple
UPDATE Tb_Producto
SET Pre_pro= CASE cod_pro
WHEN 'P002' THEN '35'
WHEN 'P014' THEN '20'
END
WHERE Cod_pro in ('P002', 'P014')
GO
--
SELECT * FROM Tb_Producto
WHERE Cod_pro='P002' OR Cod_pro='P014'
GO
------------------------------------
USE Data
GO
--20 Construya un Stored Procedure que permita saber como Par�metro de Salida
-- cu�ntos alumnos han aprobado y desaprobado un determinado Curso.
AS
Begin
SET @Aprobados=(SELECT COUNT (Cod_Curso) FROM TB_Detalle_Alumno
WHERE Cod_Curso=@Curso AND (Parcial+Final)/2.00>=11)
ELSE
INSERT Tb_Curso(Cod_Curso,Nom_Curso,Num_creditos)
VALUES (@Cod_curso, @Nom_curso, @Num_Creditos)
End
GO
/*---------------------------------------
Profesor: Ing. F. Erick Tamayo
E-mail: f.erick.tamayo@gmail.com
Curso: Base de Datos
Sesi�n 11 TSQL
---------------------------------------*/
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'~~~ ~~~`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@' `@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@' `@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@' `@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@' `@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@' `@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@' `@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@' `@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@ n, @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@ _/ | _ @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@ /' `'/ @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@a <~ .' a@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@ .' | @@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@a _/ | a@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@a _/ `.`. a@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@a ____/ ' \__ | |______ a@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@a__/___/ /__\ \ \ \___.a@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@/ (___.'\_______)\_|_| \@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@|\________ ~~~~~\@@@@@@@@@@@@@@@@@@
~~~\@@@@@@@@@@@@@@|| |\___________________________/|@/~~~~~~~~~~~\@@@
|~~~~\@@@@@@@/ | | | | | ||\____________|@@
*/
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- I- Seguimos con los Stored Procedure
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
INSERT Distrito
VALUES
('D01', 'San Isidro'),
('D02', 'Ate'),
('D03', 'Barranco')
GO
-- �xito
EXECUTE usp_Prueba 'D04', 'Los Olivos'
GO
--Comprobando
SELECT * FROM Distrito
GO
-- 02 Mejorando el SP anterior
-- Stored Procedure "PruebaCompleta"
RETURN 0 -- �xito
END
GO
--Insertamos Lince
INSERT Distrito
VALUES
('D05', 'Lince')
GO
-- Tenemos 5 distritos
SELECT * FROM Distrito
GO
--Veamos
SELECT * FROM Distrito
GO
--Si usted crea un SP sin RETURNs, puede ver las alertas normales de infracci�n.
-- Al no tener RETURN 1 para el error con respecto a los nulos, vemos nuestro
-- mensaje personalizado, pero tambi�n vemos el Mensaje de Error de SQL Server
-- predeterminado para estos casos (Mensaje 515)
BEGIN
PRINT 'El c�digo del distrito ya existe'
RETURN 2
END
--03 Validar que el c�digo tenga tres caracteres
IF LEN(@IDDistrito)<>3
BEGIN
PRINT 'El c�digo debe tener 3 caracteres'
RETURN 3
END
RETURN 0 -- �xito
END
GO
--�xito
EXECUTE usp_insertarDistrito 'D06', 'Miraflores'
GO
--Comprobamos
SELECT * FROM Distrito
GO
AS BEGIN
BEGIN
PRINT 'El C�digo del Cliente ya existe'
RETURN 2
END
BEGIN
PRINT 'El Distrito no existe'
RETURN 4
END
RETURN 0 -- �xito
END
GO
EXECUTE usp_insertarCliente
'CL02', 'Ingrid D�az', 'Calle BuenaVida 123', 'D04', '5000'
GO
--�xito
EXECUTE usp_insertarCliente
'CLI02', 'Janeth Vela', 'Calle BuenaVida 456', 'D02', '7000'
GO
-- Comprobamos
SELECT * FROM Cliente
GO
-- Usar Edutec
USE Edutec
GO
--
SELECT * FROM Alumno
SELECT * FROM Curso
SELECT * FROM CursoProgramado
SELECT * FROM Matricula
GO
AS
BEGIN
SELECT @Vacantes=Vacantes,
@Activo=Activo,
@Matriculados=Matriculados
FROM Cursoprogramado
WHERE IdCursoProg=@IdCursoProg
IF(@Activo=0)
BEGIN
PRINT 'El Curso Programado no est� activado'
RETURN 5
END
IF(@Vacantes=0)
BEGIN
PRINT 'No hay vacantes'
RETURN 6
END
BEGIN TRANSACTION
UPDATE CursoProgramado
SET Vacantes=@Vacantes-1,
Matriculados=@Matriculados+1
WHERE IDCursoProg=@IDCursoProg
IF(@@ERROR<> 0)
BEGIN
PRINT 'Error en la Base de Datos'
ROLLBACK TRANSACTION
RETURN 7
END
COMMIT TRANSACTION
RETURN 0
END
GO
UPDATE CursoProgramado
SET Vacantes='0', Matriculados='20'
WHERE IdCursoProg='44'
GO
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
-- II- Triggers
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--
/*
TRIGGERS DML
AFTER:
- AFTER INSERT
- AFTER DELETE
- AFTER UPDATE
Los Triggers pueden evaluar el estado de una tabla antes y despu�s de realizar
una modificaci�n de datos y actuar en funci�n de esa diferencia.
*/
-- Del libro
-- (Ejercicio 141)
USE TEST
GO
-- PK en DetalleFactura
ALTER TABLE DetalleFactura
ADD CONSTRAINT PK_DetalleFactura
PRIMARY KEY(IdFactura,IdProducto)
GO
-- Insertamos 2 Facturas
INSERT Factura
VALUES
(1, '31/10/2013', 'Comercial G�mez', NULL),
(2, '02/11/2013', 'Juan L�pez Cordero', NULL)
GO
-- Comprobamos
SELECT * FROM Factura
GO
--------------------------------
-- TRIGGER AFTER INSERT
--------------------------------
UPDATE Factura
SET MontoFactura=@Suma
WHERE IdFactura=@Factura
GO
-- Registrando la Factura 3
INSERT Factura
VALUES(3, '02/11/2013', 'Rep.Asunci�n', NULL)
GO
-- Probando el desencadenante
INSERT DetalleFactura VALUES (3,101,12.5,100)
INSERT DetalleFactura VALUES (3,127,15,100)
INSERT DetalleFactura VALUES (3,107,10,100)
GO
-- Verificando la Data
SELECT * FROM DetalleFactura
GO
--------------------------------
-- TRIGGER AFTER DELETE
--------------------------------
UPDATE Factura
SET MontoFactura=@Suma
WHERE IdFactura=@Factura
GO
-- Probando el Desencadenante
DELETE FROM DetalleFactura
WHERE IdFactura=1 AND IdProducto=101
GO
--------------------------------
-- TRIGGER AFTER UPDATE
--------------------------------
UPDATE Factura
SET MontoFactura=@Suma
WHERE IdFactura=@Factura
END
GO
/*
TRIGGERS DDL
------------
*/
--Probamos el desencadenante
DROP TABLE Factura
GO
--------------------------------
-- TRIGGERS CON LA BD EDUTEC
--------------------------------
USE Edutec
GO
SELECT @Vacantes=CP.Vacantes
FROM CursoProgramado CP, Inserted I
WHERE CP.IdCursoProg=I.IdCursoProg
IF(@Vacantes=0)
Begin
PRINT 'No hay vacantes'
ROLLBACK TRANSACTION
End
Else
Begin
UPDATE CursoProgramado
SET Vacantes=Vacantes-1, Matriculados=Matriculados+1
FROM Inserted I
WHERE CursoProgramado.IdCursoProg=i.IdCursoProg -- Se uso un UPDATE
FROM
-- con WHERE entre
Tablas
-- (pudo usarse Join)
-- Probando el Trigger
USE MarketPERU
GO
-- Veamos una lista de todos los Productos con sus respectivos Stocks Actuales
SELECT IdProducto, Nombre, StockActual FROM PRODUCTO
COMPUTE COUNT(IdProducto)
GO
BEGIN TRANSACTION
-- Verificamos la cantidad pedida
IF @Cantidad<= @Unidades
Begin
UPDATE PRODUCTO
SET StockActual=@Unidades-@Cantidad
FROM PRODUCTO P
INNER JOIN Inserted I
ON P.IdProducto=I.IdProducto
COMMIT TRANSACTION
PRINT 'Stock Actualizado'
End
ELSE
Begin
PRINT 'No existen suficientes Productos para satisfacer el Pedido'
ROLLBACK TRANSACTION
End
GO
-- Probando el Trigger
INSERT GUIA
VALUES(108, 2, '11/11/2013', 'VELASQUEZ ORTIZ, FRANCISCO')
GO
INSERT GUIA_DETALLE
VALUES(108, 2, 1.50, 50)
GO
--------------------------------
-- TRIGGERS CON LA BD VENTAS
--------------------------------
USE Ventas
GO
-- Probando el Trigger
INSERT TB_CLIENTE
VALUES
('C021', 'Procter y Gamble', 'Av El Sol 111', '5551010',
'12345150', 'd17', GETDATE(), '1', 'Mateo H.')
GO
BEGIN
BEGIN TRAN
IF (@SA>=@CAN_VEN)
BEGIN
PRINT 'SI VENDIO'
UPDATE Tb_Producto
SET Stk_act= @SA-@CAN_VEN
WHERE Cod_pro=(SELECT Cod_pro FROM INSERTED)
COMMIT TRAN
END
ELSE
BEGIN
ROLLBACK TRANSACTION
PRINT 'NO HAY STOCK'
END
END
GO
-- Probando el Trigger
-- Probando el Trigger
-- Trataremos de eliminar al Vendedor V01
DELETE FROM Tb_Vendedor
WHERE Cod_ven='V01'
GO
-- Una factura de Estado 1 significa que es una factura sin fecha de cancelaci�n,
-- por lo tanto, significa que est� siendo dada a cr�dito.
-- Es por eso que igualo que en la factura a insertar su estado sea igual a 1.
-- Probando el Trigger
SELECT * FROM Tb_Factura
GO
BEGIN TRANSACTION
IF @PENDIENTES>=1
BEGIN
PRINT 'CLIENTE TIENE FACTURAS PENDIENTES'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT ' SE GENERO LA FACTURA'
COMMIT TRANSACTION
END
GO
-- Probando el Trigger
-- Vemos que los Clientes con Facturas pendientes son los Clientes C014, C015 y
C019
SELECT * FROM Tb_Factura
WHERE Est_fac='1'
GO
/*
.---.
/ . \
|\_/| |
| | /|
.----------------------------------------------------------------' |
/ .-. |
| / \ |
| |\_. | Hasta la pr�xima |
|\| | /| |
| `---' | Atte. |
| | Ing. F. Erick Tamayo |
| | Email: f.erick.tamayo@gmail.com |
| | Diciembre 2017 |
| | /
| |----------------------------------------------------------'
\ |
\ /
`---'
*/