Está en la página 1de 21

Ejercicios de consulta de

mltiples condiciones
Ing. Edwin O. Ramos Velsquez
Universidad Nacional Jos Mara Arguedas
Carrera Profesional de Ingeniera de Sistemas
Andahuaylas Per

Ing. Edwin Ramos Velsquez

---------------------------------------------------------------------------------------------- Ejemplo 1: Seleccin de datos de una sola tabla


SELECT Cod_Empleado, Apellidos, Nombres -- 1. Seleccion de los campos a visualizarse
FROM Empleado
-- 2. Seleccion de la primera tabla
---------------------------------------------------------------------------------------------- Ejemplo 2: Seleccin de datos de dos tablas
SELECT E.Cod_Empleado, E. Apellidos, E. Nombres, P.Monto_Pedido -- 1. Selecc de campos a ver
FROM Empleado AS E
-- 2. Seleccion de la primera tabla
JOIN Pedido AS P ON (E.cod_Empleado = P.cod_empleado) --3. Siguiente Tabla
---------------------------------------------------------------------------------------------- Ejemplo 3: Seleccin de datos de tres o ms tablas
SELECT E.Cod_Empleado, E. Apellidos, E. Nombres,
P.ID_Pedido,D.Cod_Producto
-- 1. Seleccion de los campos a visualizarse
FROM Empleado AS E
-- 2. Seleccion de la primera tabla
JOIN Pedido
AS P ON (E.cod_Empleado = P.cod_empleado) --3. Siguiente Tabla
JOIN Detalle_Pedido AS D ON (P.ID_Pedido
= D.ID_pedido)

Ing. Edwin Ramos Velsquez

-- Ejemplo 4: Seleccion de dos tablas que estan relacionadas


-por tres o N campos
SELECT C.Tipo_Comprobante, C.Nro_Serie, C.Nro_Comprobante,
C.Fecha_Emision, D.Cod_Producto
FROM Comprobante_Pago AS C
INNER JOIN Detalle_Comprobante_Pago AS D
ON(C.Tipo_Comprobante = D.Tipo_Comprobante AND C.Nro_Serie = D.Nro_Serie
AND C.Nro_Comprobante = D.Nro_Comprobante)
---------------------------------------------------------------------------------------------- Ejemplo 5: Uso de SubConsultas para seleccion
SELECT P.Cod_Producto, P.Nombre_Producto
FROM Producto AS P
WHERE Exists
( SELECT C.Tipo_Comprobante, C.Nro_Serie, C.Nro_Comprobante,
C.Fecha_Emision, D.Cod_Producto
FROM Comprobante_Pago AS C
INNER
JOIN
Detalle_Comprobante_Pago
AS
D
ON(C.Tipo_Comprobante=D.Tipo_Comprobante
C.Nro_Comprobante = D.Nro_Comprobante)
WHERE YEAR(C.Fecha_Emision)=2002 AND P.Cod_Producto=D.Cod_Producto
)

Ing. Edwin Ramos Velsquez

AND

C.Nro_Serie=D.Nro_Serie

AND

Consultas Intersectando
subconjuntos de datos

Ing. Edwin Ramos Velsquez

CONSULTAS DONDE TENEMOS SUBCONJUNTOS DE DATOS


Conjunto 01

Conjunto 02

Pivot
Comparativo

1. Usando WHERE IN ()
Conjunto 01 (IDComun)
WHERE IDComun IN
Pivot
Conjunto 02 (IDComun)

Usar DISTINCT

2. Usando INNER JOIN

Usamos DISTINCT para evitar duplicidad de registros

Pivot

Conjunto 01 (IDComun) C1
INNER JOIN
Conjunto 01 C2 ON ( C1.IDComun = C2.IDComun)
Ing. Edwin Ramos Velsquez

CONSULTAS DONDE TENEMOS SUBCONJUNTOS DE DATOS


Conjunto 01

Conjunto 02

Pivot
Comparativo

3. Usando Tablas Temporales (SELECT .. INTO #TablaTemporal)


Pivot

Pivot

Conjunto 01 (IDComun)
INTO
#TablaTemporal01

Conjunto 02 (IDComun)
INTO
#TablaTemporal02

SELECT [Campo1, Campo2, ] FROM #TablaTemporal01


WHERE IDComun IN
(SELECT IDComun FROM #TablaTemporal02)
Si no usa el WHERE IDComun IN , puede utilizar el INNER JOIN
Ing. Edwin Ramos Velsquez

Todos los clientes que han comprado algo:


Conjunto 01

Conjunto 02

Pivot

Comparativo

IDCliente

Modo 1:

Modo 2:

SELECT IDCliente, RazSocial


FROM Cliente
WHERE IDCliente IN (SELECT IDCliente FROM Venta)
SELECT DISTINCT IDCliente, RazSocial
FROM Cliente C
INNER JOIN Venta V ON (C.IDCliente = V.IDCliente)
Ing. Edwin Ramos Velsquez

CONSULTAS EN
PROCEDIMIENTOS
ALMACENADOS
Ing. Edwin Ramos Velsquez

SET NO COUNT
Evita que se devuelva el mensaje que muestra el recuento del nmero de filas afectadas por una instruccin o un procedimiento
almacenado de Transact-SQL como parte del conjunto de resultados.

Si se establece SET NOCOUNT en ON, no se devuelve


el recuento. Cuando SET NOCOUNT es OFF, s se
devuelve ese nmero.
La funcin @@ROWCOUNT se actualiza incluso cuando
SET NOCOUNT es ON.
SET NOCOUNT ON impide el envo al cliente de
mensajes DONE_IN_PROC por cada instruccin de un
procedimiento almacenado. En los procedimientos
almacenados que contengan varias instrucciones que no
devuelven mucha informacin real o en los
procedimientos que contengan bucles de Transact-SQL,
establecer SET NOCOUNT en ON puede suponer una
mejora significativa del rendimiento, ya que el trfico
de la red se reduce en gran medida.
La configuracin especificada por SET NOCOUNT est
activa en tiempo de ejecucin, no en tiempo de anlisis.

USE AdventureWorks2008R2;
GO
SET NOCOUNT OFF;
GO
-- Display the count message.
SELECT TOP(5)LastName
FROM Person.Person
WHERE LastName LIKE 'A%';
GO
-- SET NOCOUNT to ON to no longer display the
-- count message.
SET NOCOUNT ON;
GO
SELECT TOP(5) LastName
FROM Person.Person
WHERE LastName LIKE 'A%';
GO
-- Reset SET NOCOUNT to OFF
SET NOCOUNT OFF;
GO
En este ejemplo no se muestra el mensaje que indica el nmero de filas afectado.

Ing. Edwin Ramos Velsquez

Consultas con tablas temporales


CREATE PROCEDURE MyProcedimiento
@Parametro1 INT,
@Parametro2 VARCHAR(10)
AS
BEGIN
SET NOCOUNT ON

DESACTIVA los
mensajes

-- Consultas y tablas temporales


CREATE TABLE #MyTabla
-- Llenado de datos en #MyTabla
Insert INTO #MyTabla (..,.,) VALUES (val1, val2, .)
ACTIVA los
mensajes

SET NOCOUNT OFF

-- Consulta a retornar (devolver)


SELECT Campo1, Campo2, ., FROM #MyTabla
END
Ing. Edwin Ramos Velsquez

10

Consultas con tablas temporales: Ejemplo(1)


EXEC ListaDeNumerosPares 20

INICIO

CREATE PROCEDURE
ListaDeNumerosPares
@N INT
AS
DESACTIVA los
BEGIN
mensajes
SET NOCOUNT ON
--------- Procesos preparatorios -----------------------DECLARE @k INT
CREATE TABLE #MyTabla(
Posicion INT,
Numero INT
)

Crear Tabla
#MyTabla
Insertar
Datos

CREAR tabla
temporal

INSERTA datos en la
SET @k = 1
tabla temporal
WHILE (@k <= @Numeros)
BEGIN
INSERT INTO #MyTabla (Posicion, Numero) VALUES (@k, @k * 2 )
SET @k = @k + 1
END

Usar Tabla
#MyTabla

Consultar
#MyTabla

--------- Retornar resultado --------------------SET NOCOUNT OFF

ACTIVA los
mensajes

FIN

-- Consulta a retornar (devolver)


SELECT Posicion,Numero FROM #MyTabla ORDER BY Posicion
END
Ing. Edwin Ramos Velsquez

11

Consultas con tablas temporales: Ejemplo(2)


EXEC ListaDeAlumnosDeLaCiudad Lima
CREATE PROCEDURE
ListaDeAlumnosDeLaCiudad
@Ciudad VARCHAR(20)
AS
DESACTIVA los
BEGIN
mensajes
SET NOCOUNT ON
--------- Procesos preparatorios -----------------------INICIO

CREAR tabla
temporal

SELECT IDAlumno, Nombre, Apellido


INTO #MyTabla
FROM Tabla_Alumno
WHERE Ciudad = @Ciudad

Crear Tabla
#MyTabla
Insertar
Datos

ALTER TABLE #MyTabla ADD CampoX INT


UPDATE #MyTabla SET CampoX = IDAlumno

Usar Tabla
#MyTabla

INSERTA/MODIFICA
datos en la tabla
temporal

--------- Retornar resultado --------------------SET NOCOUNT OFF

ACTIVA los
mensajes

-- Consulta a retornar (devolver)


SELECT IDAlumno, Nombre, Apellido, CampoX FROM #MyTabla ORDER BY IDAlumno

Consultar
#MyTabla

END
FIN

Ing. Edwin Ramos Velsquez

12

Consultas con Cursores: Ejemplo(3)


CREATE PROCEDURE
AS
BEGIN

EjemploManejoDeCursores
1. Declara Variables a usar
para leer desde el Cursor

DECLARE @Nombre VARCHAR(20)


DECLARE @Edad INT
DECLARE MyCursor CURSOR FOR
SELECT Nombre, Edad FROM Alumnos
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @Nombre, @Edad

2. Declara el Cursor
3. Apertura el Cursor
4. Mueve al Inicio
(1er Registro)

--------- Bucle (iteraciones 1 por cada registro) --------------------WHILE @@FETCH_STATUS = 0


BEGIN
IF ( @Edad >= 18 )
PRINT @Nombre + es MAYOR de edad
ELSE
PRINT @Nombre + es MENOR de edad
FETCH NEXT FROM MyCursor INTO @Nombre, @Edad
END
CLOSE MyCursor
DEALLOCATE MyCursor
END

5. Utiliza los valores


ledos con el Cursor
6. Mueve al
Siguiente Registro

7. Cierra el cursor y LIBERA


los recursos usados
Ing. Edwin Ramos Velsquez

13

Ejemplo de procedimiento con cursores


CREATE PROCEDURE spAgregarEdadesEnString
AS
BEGIN
DECLARE
DECLARE
DECLARE
DECLARE

@IDAlumno INT
@Edad INT
@Nombre VARCHAR(20)
@Apellido VARCHAR(20)

DECLARE @EdadStr VARCHAR(30)


SET NOCOUNT ON
-----------------------------------------------CREATE TABLE #AlumnoTemp(
IDAlumno INT, Nombre VARCHAR(20), Apellido VARCHAR(20), Edad INT, EdadStr VARCHAR(30)
)
DECLARE cursor_Alumnos CURSOR FOR
SELECT IDAlumno, Nombre, Apellido, Edad FROM Alumnos
ORDER BY IDAlumno
OPEN cursor_Alumnos
FETCH NEXT FROM cursor_Alumnos INTO @IDAlumno, @Nombre, @Apellido, @Edad
WHILE @@FETCH_STATUS = 0
BEGIN
SET @EdadStr = dbo.Decimal_To_STR(@Edad)
INSERT INTO #AlumnoTemp(IDAlumno, Nombre, Apellido, Edad, EdadStr)
VALUES(@IDAlumno, @Nombre, @Apellido, @Edad, @EdadStr)
FETCH NEXT FROM cursor_Alumnos INTO @IDAlumno, @Nombre, @Apellido, @Edad
END
CLOSE cursor_Alumnos
DEALLOCATE cursor_Alumnos
-----------------------------------------------SET NOCOUNT OFF
SELECT * FROM #AlumnoTemp
Ing. Edwin Ramos Velsquez
END

14

UnidToStr(N:Integer ):String
INICIO
Z = N modulo 10

CASE
(Z)

Z=0

Z=1

S = ''

S = 'Uno'

Z=2
S = 'Dos'

Z=9
----

S = 'Nueve'

return S
DecimalToStr(N:Integer ):String

FIN

INICIO
R = N Modulo 10
Z = EnteroDe(N / 10)

IF
(R = 0)

SI

NO
CASE
(Z)

CASE
(Z)
Z=0
S =UnitToStr(N)
Z=1
S = 'diez'

Z=2
S = 'veinte'

----

Z=9
S = 'noventa'

Z=2

Z=1

N=1
1
--S = 'once'

CASE
(N)
Else

N=15

----

Z=9

S = 'veinti'+UnitToStr(N)

S = 'quince'
S = 'noventa y '+UnitToStr(N)
S = 'dieci' + UnitToStr(N)

return S
FIN

Ing. Edwin Ramos Velsquez

15

Consultas de conjuntos de datos en


procedimientos almacenados
CREATE PROCEDURE MyProcedimiento
@Parametro1 INT,
@Parametro2 VARCHAR(10)
AS
BEGIN

Conjunto1

Conjunto2

SET NOCOUNT ON
Consulta1 INTO #TablaTemporal1
WHERE Campo1 = @Parametro1
Consulta2

INTO TablaTemporal2
WHERE Campo1 = @Parametro2

ConsultaN

INTO #TablaTemporalN

Conjunto3

Conjunto4

SET NOCOUNT OFF


Consulta_Final FROM #TablaTemporal1, #TablaTemporal2,
#TablaTemporal3 , ..
RETURN 0
END
Ing. Edwin Ramos Velsquez

16

Base de datos a usar en los ejemplos

Ing. Edwin Ramos Velsquez

17

Ejemplo 01

Todos los empleados que vendieron los


productos de la Marca X
Apellidos

CREATE PROCEDURE
@Marca VARCHAR(10)
AS
BEGIN

Nombres

Producto

sp_Empleados_que_vendieron_articulos_de_marca
Venta

SET NOCOUNT ON
SELECT IDVenta, Apellidos, Nombres INTO #TablaTemporal1
FROM Empleado E
IDComun=IDVenta
INNER JOIN VENTA V ON (E.IDEmpleado = V.IDEmpleado)

SELECT IDVenta, Articulo INTO TablaTemporal2


FROM Marca M
IDComun=IDVenta
INNER JOIN Articulo V ON (M.IDMarca = V.IDMarca)
INNER JOIN DetalleVenta D ON (M.IDArticulo = V.IDArticulo)
WHERE UPPER(Marca) = UPPER(@Marca)

Empleado

IDEmpleado

Marca

Articulo

DetalleVenta

IDMarca
IDArticulo

Empleados

Artculos vendidos

SET NOCOUNT OFF


TablaTemporal1

SELECT DISTINCT Apellidos, Nombres, Articulo


FROM #TablaTemporal1 T1
INNER JOIN #TablaTemporal2 T2 ON
ORDER BY Apellidos, Nombres
RETURN 0

(T1.IDVenta=T2.IDVenta)

TablaTemporal2

IDVenta

END
Ing. Edwin Ramos Velsquez

18

Ejemplo 02

Todos los 15 primeros artculos ms vendidos en


el ao X
IDArticulo

CREATE PROCEDURE
@Anyo INT
AS
BEGIN

Articulo

Cantidad

sp_Los _quince_articulos_mas_vendidos
Venta

SET NOCOUNT ON
SELECT TOP 15 IDArticulo, Total=SUM(Cantidad) INTO #TablaTemporal1
FROM Venta V
IDComun=IDArticulo INNER JOIN DetalleVenta D ON (V.IDVenta = D.IDVenta)
WHERE YEAR(Fecha) = @Anyo
GROUP BY IDArticulo
ORDER BY 2 DESC

SELECT IDArticulo, Articulo INTO TablaTemporal2


FROM Articulo

DetalleVenta

IDVenta

Articulo
IDArticulo

IDComun=IDArticulo
Articulos

IDArtculos ms
vendidos

SET NOCOUNT OFF


TablaTemporal1

SELECT T2.IDArticulo, Articulo, (Cantidad ) AS Total


FROM #TablaTemporal1 T1
INNER JOIN #TablaTemporal2 T2 ON (T1.IDArticulo=T2.IDArticulo)
ORDER BY 3
RETURN 0

TablaTemporal2

IDArticulo

END
Ing. Edwin Ramos Velsquez

19

Ejemplo 03

Todos los clientes que no compraron artculos de


la marca X
Razon_Social

CREATE PROCEDURE sp_Los _clientes_que_no_compraron_articulos_de_marca


@Marcha VARCHAR(15)
AS
BEGIN
SET NOCOUNT ON
SELECT DISTINCT IDCliente INTO #TablaTemporal1
FROM Venta V
IDComun=IDCliente
INNER JOIN DetalleVenta D ON (V.IDVenta = D.IDVenta)
INNER JOIN Articulo A ON (D.IDArticulo = A.IDArticulo)
INNER JOIN Marca M ON (A.IDMarca = M.IDMarca)
WHERE UPPER(Marca) = UPPER(@Marca)

RUC

Venta
IDVenta

DetalleVenta

Articulo
Marca

IDArticulo
IDMarca

Cliente
IDCliente

SELECT IDCliente, RazSocial INTO TablaTemporal2


FROM Cliente

IDComun=IDCliente

IDArtculos ms
vendidos

Articulos

SET NOCOUNT OFF

TablaTemporal1

SELECT (RazSocial) AS Razon_Social, RUC


FROM #TablaTemporal2
WHERE IDCliente NOT IN
( SELECT IDCliente FROM #TablaTemporal1 )

TablaTemporal2

IDCliente

RETURN 0
END

Ing. Edwin Ramos Velsquez

20

CONTINE
LOS

DESARROLLANDO

DEMS

EJERCICIOS

Ing. Edwin Ramos Velsquez

21

También podría gustarte