23

Click here to load reader

Ejercicios SQL

Embed Size (px)

Citation preview

Page 1: Ejercicios SQL

[estas son las tablas que usamos]

UNION

UNION: (OTRO DIA M PONGO A COMPLETAR TODO)

EJERCICIOS:

Se quiere saber que vendedores y clientes hay en la empresa; para los casos en que su teléfono y dirección de e-mail sean conocidos. Se deberá visualizar el código, nombre y si se trata de un cliente o de un vendedor. Ordene por la tercer columna y la segunda.

select cod_vend, nom_vend, 'vend' Tipo from vendedores where nro_tel is not null and [e-mail] is not null union select cod_clie, nom_clie, 'cliente' from clientes where nro_tel is not null and [e-mail] is not null order by 3,2

Se quiere saber que artículos, clientes y vendedores hay en la empresa. Determine los campos a

Page 2: Ejercicios SQL

mostrar y su ordenamiento

select cod_arti 'Código', descripcion 'Nombre', 'Articulo'Tipo from articulos union select cod_clie, nom_clie, 'Cliente' from clientes union select cod_vend, nom_vend, 'Vendedor' from vendedores order by 3

Se quiere saber que artículos hay en la empresa y cuáles han sido vendidos. Determine Ud. las columnas a mostrar.

select cod_arti Código, descripcion Articulo, 'En Stock' Tipo from articulos union select D.cod_arti, A.descripcion, 'Vendido' from detalle D, Articulos A where D.cod_arti = A.cod_arti order by 3

Se quiere saber las direcciones tanto de clientes como de vendedores. Para el caso de los vendedores, códigos entre 3 y 12. En ambos casos la direcciones deberán ser conocidas. Rotule como NOMBRE, DIRECCION, INTEGRANTE (en donde indicará si es cliente o vendedor). Ordenado por la primera columna y la última.

select nom_clie Nombre, direccion Direccion, 'Cliente' Integrante from clientes where direccion is not null union select nom_vend, direccion, 'Vendedor' from vendedores where direccion is not null and cod_vend between 3 and 12 order by 1,3

Page 3: Ejercicios SQL

Se quiere saber que clientes hay en la empresa y quienes han comprado entre el 11/12/2002 y el 27/02/2003. Muestre el código, sin duplicarlos.

select cod_clie Codigo from clientes union select cod_clie from facturas where fecha between 2002-11-12 and 2003-27-02

Idem al ejercicio anterior, sólo que además del código, identifique de donde obtiene la información.

select cod_clie Código, 'Clientes' Desde from clientes union all select cod_clie, 'Facturas' from facturas F where fecha between '2002-11-12' and '2003-27-02'

Se quiere saber que clientes hay en la empresa y quiénes han comprado; para el primer caso para nombres que empiecen con letras que van de la “c” a la “l” y para el segundo para facturas que oscilen entre 10 y 23. Muestre el código (no elimine los que se repiten).

select cod_clie Código, 'Pasivo' Tipo from clientes where nom_clie like '[c-l]%' union all select cod_clie, 'Activo' from facturas F where F.nro_factu between 10 and 23

-------------------------------------------------------------------------------------

INNER JOIN

Page 4: Ejercicios SQL

El INNER JOIN: Es otro tipo de composición de tablas. En lugar de hacer el producto cartesiano completo, para cada una de las tablas busca directamente en la otra tabla las filas que cumplen la condición. LEFT OUTER JOIN: Toma todos los registros de la tabla izquierda, aunque no tengan ningún registro coincidente (clave), en la tabla de la derecha. RIGHT OVER JOIN: Realiza la selección de todos los registros de la tabla de la derecha, aunque NO tenga ningún registros de la tabla de izquierda.

EJERCICIOS:

Liste factura, fecha, vendedor y cliente para las ventas del año 2006 y 2007.

select f.nro_factu, f.fecha,v.nom_vend, c.nom_clie from facturas f inner join vendedores v on f.cod_vend=v.cod_vend inner join clientes c on f.cod_clie=c.cod_clie where year (f.fecha) in (2006, 2007)

Liste código de vendedor, nombre, fecha y factura; para las ventas en lo que va del año.

select v.cod_vend, v.nom_vend, f.fecha, f.nro_factu from facturas f inner join vendedores v on f.cod_vend=v.cod_vend where year(f.fecha)=2007

Liste código de vendedor, nombre, fecha y factura; para las ventas en lo que va del año.

select v.nom_vend, v.cod_vend, f.fecha, f.nro_factu from facturas f right join vendedores v on f.cod_vend=v.cod_vend where year(f.fecha)=2007 or f.fecha is null or f.nro_factu is null

Liste descripción, cantidad e importe; aun para aquellos artículos que no registran ventas.

Page 5: Ejercicios SQL

select a.descripcion, d.cant, d.pre_unit, d.pre_unit*d.cant as 'total' from detalle d full join articulos a on d.cod_arti=a.cod_arti full join facturas f on d.nro_factu=f.nro_factu order by a.descripcion

from nombre de talba join otra table on igualamos campos para listar todas las facturas, y los clientes a los que he facturado para casos en que las facturas no tengan campo cliente, . left join es una unión a la izquierda muerto todos los campos de la izquierda y solo los coicidentes con la derecha. Con el reight Muesta todos los campos de la derecha y solo los coicidentes con la derecha Con el full join muestra todos los campos

Liste factura, fecha, vendedor, cliente, articulo, cantidad e importe; para las ventas de febrero y marzo de los años 2006 y 2007 y siempre que el articulo empiece con letras que van de la “a” a la “m”. Ordene por fecha, cliente y articulo.

select f.nro_factu, f.fecha, v.nom_vend, c.nom_clie, a.descripcion, d.cant, d.pre_unit, d.cant*d.pre_unit from facturas f full join vendedores v on f.cod_vend=v.cod_vend inner join detalle d on f.nro_factu=d.nro_factu inner join articulos a on a.cod_arti=d.cod_arti inner join clientes c on f.cod_clie=c.cod_clie where month(f.fecha)in (2, 3) and year(f.fecha) in (2006, 2007)

Liste código de cliente,nombre, fecha y factura para las ventas del año 2007. Muestre los clientes hayan comprado o no en ese año.

select c.cod_clie,c.nom_clie, f.fecha, f.nro_factu from facturas f full join clientes c on f.cod_clie=c.cod_clie where year (f.fecha)=2007

Se quiere saber los artículos que compro el cliente 7 en lo que va del año. Liste articulo,

Page 6: Ejercicios SQL

observaciones e importe.

select a.descripcion, c.nom_clie from facturas f inner join clientes c on f.cod_clie=c.cod_clie inner join detalle d on f.nro_factu=f.nro_factu inner join articulos a on d.cod_arti=a.cod_arti where c.cod_clie=7 and year(f.fecha)=2007

Se quiere saber los artículos que compraron los clientes que empiezan con “p”. Liste cliente, articulo, cantidad e importe. Ordene por cliente y articulo, este en forma descendente. Rotule como CLIENTE, ARTICULO, CANTIDAD, IMPORTE.

select c.nom_clie as 'cliente', a.descripcion as 'articulo' , d.cant as 'cantidad', d.pre_unit as 'precio', d.cant*d.pre_unit as 'total' from facturas f inner join detalle d on f.nro_factu=d.nro_factu inner join articulos a on d.cod_arti=a.cod_arti inner join clientes c on f.cod_clie=c.cod_clie where c.nom_clie like '[p]%' order by c.nom_clie desc, a.descripcion desc

----------------------------------------------------------------------------

SUB-CONSULTAS

Subconsultas: Es una consulta que aparece dentro de la cláusula WHERE ó HAVING de otra sentencia SQL. Subconsultas en la cláusula WHERE

Page 7: Ejercicios SQL

Test De Comparación: (= , < , > ) Compara el valor de una expresión con un único valor producido por una subconsulta

Test de Pertenencia A Conjunto (IN): Compara un valor de datos con una columna de valores producida por una subconsulta. NOT IN: esta expresión significa que no está incluida en la lista de valores generada por la subconsulta.

Test de Existencia (EXISTS): Comprueba si una subconsulta produce alguna fila de resultados. Este test sólo se utiliza en subconsultas. NOT EXISTS: esta expresión invierte la lógica.

Test de Cuantificados: ANY y ALL: Ambos tests comparan un valor de datos con la columna de valores producidos por una subconsulta.

EJERCICIOS:

Se quiere saber que artículos no fueron vendidos el año pasado y que el precio unitario del artículo oscile entre 2 y 6. Muestre el nombre del artículo, observaciones y precio unitario.

select cod_arti, descripcion, observaciones, pre_unit from articulos where pre_unit between 2 and 6 and cod_arti not in (select distinct cod_arti from facturas f, detalle d where d.nro_factu=f.nro_factu and year(fecha)=2008)

Se quiere saber que clientes vinieron más de 5 veces el año pasado. Muestre el nombre del cliente, número de factura y fecha. Rotule como CLIENTE, FACTURA, FECHA VENTA. Ordene por nombre de cliente y fecha

select c.cod_clie as COD_CLIENTe, c.nom_clie as CLIENTES ,f.nro_factu as FACTURAS, f.fecha as FECHA from clientes c, facturas f where c.cod_clie=f.cod_clie and year (fecha)=2008 and 5<(select count (*) from facturas f1 where f1.cod_clie=c.cod_clie and year (fecha)=2008 ) order by c.nom_clie, f.fecha asc

Page 8: Ejercicios SQL

Se quiere saber que clientes vinieron entre el 12/12/2004 y el 13/7/2007. Muestre el nombre del cliente y su dirección de mail. Ordene por nombre de cliente.

select c.cod_clie, c.nom_clie, [e-mail] from clientes c where cod_clie in (select cod_clie from facturas where fecha between '12/12/2004' and '13/7/2007')

Liste número de factura, fecha y cliente para los casos en que todas las veces que vino a comprar haya sido en el mes de febrero. Ordene por cliente y fecha.

select distinct c.cod_clie, c.nom_clie, [e-mail] from clientes c, facturas f where c.cod_clie=f.cod_clie and fecha between '12/12/2004' and '13/7/2007'

Muestre el número de factura y la fecha de venta para los casos en que por año se hayan hecho menos de 9 ventas. Rotule como FACTURA, FECHA VENTA.

select f.nro_factu as FACTURA , f.fecha as FECHA_VENTA from facturas f where 9 > ( select count(*) from facturas f1 where year (f.fecha) = year (f1.fecha) )

Muestre el número de factura, la fecha de venta, el artículo y el importe para los casos en que para esa factura su importe total sea superior o igual a 150.

select f.nro_factu , f.fecha , a.descripcion , d.pre_unit*d.cant from facturas f , articulos a , detalle d where a.cod_arti = d.cod_arti and f.nro_factu = d.nro_factu and 150 < = ( select sum (d1.pre_unit*d1.cant) from detalle d1 where d1.nro_factu = d.nro_factu)

Se quiere saber que vendedores nunca atendieron a estos clientes:6, 1. Muestre solamente el nombre del vendedor. Rotule como VENDEDOR.

Page 9: Ejercicios SQL

select * from vendedores v where v.cod_vend not in ( select f.cod_vend from facturas f where cod_clie in (1,6) )

Se quiere saber de que artículos superó el promedio de ventas de 80. Muestre el nombre del artículo y sus observaciones. Rotule como ARTICULO, OBSERVACIONES.

select descripcion as ARTICULOS , observaciones as OBSERVACIONES from articulos a where 80 < ( select avg (pre_unit*cant) from detalle d where a.cod_arti = d.cod_arti)

Que artículos nunca se vendieron?. Tenga además en cuenta que su nombre comience con letras que van de la “d” a la “p”. Muestre solamente la descripción de artículo.

select descripcion from articulos a where cod_arti not in ( select distinct d.cod_arti from detalle d) and a.descripcion like '[d-p]%' order by descripcion´

-------------------------------------------------

SUB-CONSULTAS CON HAVING

EJERCICIOS:

Se quiere saber la fecha de la primer venta y el importe de ventas por vendedor, para los casos en que su promedio de ventas sea superior al importe promedio global. Rotule como

Page 10: Ejercicios SQL

VENDEDOR, TOTAL VENTAS.

select nom_vend, min(fecha), sum(pre_unit*cant), avg(pre_unit*cant) from facturas f, detalle d, vendedores v where f.nro_factu=d.nro_factu and v.cod_vend=f.cod_vend group by nom_vend having avg(pre_unit*cant) > (select avg(pre_unit*cant) from detalle)

Se quiere saber el importe promedio y el importe de ventas por fecha y cliente, para los casos en que los números de factura que oscilen entre 20 y 35 y que ese importe de ventas sea superior o igual al promedio global. Rotule como FECHA VENTA, CLIENTE, IMPORTE, PROMEDIO.

SELECT fecha, nom_clie, sum(pre_unit*cant), avg(pre_unit*cant) from facturas f, clientes c, detalle d where f.nro_factu= d.nro_factu and c.cod_clie = f.cod_clie and f.nro_factu between 20 and 35 group by fecha, nom_clie, d.cod_arti having sum(pre_unit*cant) > (select avg(pre_unit*cant) from detalle )

Se quiere saber el importe vendido, la cantidad vendida por artículo, para los casos en que los números de factura no sean uno de los siguientes:2, 10, 7, 13, 22 y que ese importe promedio sea inferior al importe promedio de ese artículo.

SELECT descripcion, sum(d.pre_unit*cant), avg(d.pre_unit*cant) from articulos a, detalle d where a.cod_arti = d.cod_arti and nro_factu not in (10,2,7,13,22) group by descripcion, d.cod_arti having avg(d.pre_unit*cant) < (select avg(d1.pre_unit*cant) from detalle d1 where d1.cod_arti= d.cod_arti)

Se quiere saber la cantidad vendida, el importe vendido y el promedio vendido por fecha, siempre que esa cantidad vendida sea superior al promedio de la cantidad global. Rotule como FECHA VENTA, CANTIDAD, IMPORTE, PROMEDIO. Ordene por fecha en forma descendente.

select fecha, sum(cant), sum(pre_unit*cant), avg(pre_unit*cant) from facturas f, detalle d where f.nro_factu =d.nro_factu group by fecha having sum(cant) > (select avg(cant) from detalle)

Se quiere saber el promedio vendido por fecha y artículo para los casos en que las cantidades

Page 11: Ejercicios SQL

vendidas oscilen entre 5 y 20 y que ese importe sea superior al importe promedio de ese artículo. Rotule como FECHA VENTA, ARTICULO, FEC PRIMER VENTA, PROMEDIO.

select fecha, descripcion, avg(d.pre_unit*cant) from facturas f, articulos a, detalle d where f.nro_factu = d.nro_factu and a.cod_arti = d.cod_arti and cant between 5 and 20 group by fecha, descripcion, d.cod_arti having sum(d.pre_unit*cant) > (select avg(d1.pre_unit*cant) from detalle d1 where d1.cod_arti =d.cod_arti)

Se quiere saber el importe vendido por fecha para los casos en que ese promedio vendido sea inferior al importe promedio global. Rotule como FECHA, IMPORTE.

SELECT fecha, sum(pre_unit*cant) from detalle d,facturas f where f.nro_factu = d.nro_factu group by fecha having avg(pre_unit*cant) < (select avg(pre_unit*cant) from detalle)

-------------------------------------------------------------

SUMARIAS

EJERCICIOS:

Se quiere saber la cantidad de clientes que hay en la empresa.

select count (cod_clie) as cantidad From dbo.clientes

Se quiere saber la cantidad de artículos que hay en la empresa.

Page 12: Ejercicios SQL

select count (cod_arti) as cantidad from dbo.articulos

Se quiere saber que cantidad de vendedores hay en la empresa.

select count (cod_vend) as cantidad from dbo.vendedores

Se quiere saber la cantidad de ventas que hizo el vendedor de código 3.

select count (nro_factu) as cantidad from dbo.facturas where cod_vend = 3

Se quiere saber la cantidad vendida, la cantidad de ventas y el importe para la factura 10.

select sum(cant) as 'Cantidad vendida',count (nro_factu) as 'Cantidad de ventas',sum(pre_unit*cant) as Importe from dbo.detalle where nro_factu=10

Se quiere saber cual fue la fecha de la primera y última venta. Rotule como PRIMERVENTA, ULTIMA VENTA.

select max (fecha) as 'ultima venta' , min (fecha) as 'primera venta' from dbo.facturas

Se quiere saber cual fue la máxima y la mínima cantidad que se vendió para el artículo 10.

select max(cant) as 'Maxima venta', min (cant) as 'Minima venta' from dbo.detalle where cod_arti = 10

Se quiere saber la cantidad total vendida, el monto y el importe promedio total; para vendedores cuyo nombres comienzan con letras que van de la “d” a la “l”.

select sum (d.cant) as 'Cantidad total vendida' , sum (d.pre_unit) as 'Monto', avg (d.pre_unit*d.cant) as 'Importe promedio total' from dbo.detalle d, dbo.vendedores v where v.nom_vend like '[d-l]%'

Se quiere saber el promedio del importe vendido, el total del importe vendido, el promedio de

Page 13: Ejercicios SQL

la cantidad vendida y el total de la cantidad vendida.

select avg(pre_unit*cant) as 'Promedio importe', sum(pre_unit*cant) as 'Importe total', avg(cant) as 'Promedio cantidad vendida', sum(cant) as 'Total cantidad vendida' from dbo.detalle

Se quiere saber el total vendido, el promedio vendido y la cantidad total vendida para el cliente de código 3.

select sum(d.cant) as 'Total vendido', avg(d.cant) as 'Promedio vendido' from dbo.detalle d, dbo.clientes c where c.cod_clie = 3

Se quiere saber la fecha de la primera venta, la cantidad total vendida y el monto total vendido para los artículos que empiecen con “c”.

select min(f.fecha) as 'Fecha primer venta', sum(d.cant) as 'Cant total vendida', sum(d.pre_unit) as 'Monto total' from dbo.facturas f, dbo.detalle d, dbo.articulos a where a.descripcion like 'c%'

Se quiere saber la cantidad total vendida y el monto total vendido para el periodo del 15/06/2005 al 15/03/2007.

select sum(d.cant) as 'Cantidad total ', sum(d.pre_unit*d.cant) as 'Monto total' from dbo.detalle d, dbo.facturas f where f.fecha between '15/06/2005' and '15/03/2007'

Se quiere saber la cantidad de veces y la última vez que vino el cliente de apellido Abarca.

select count(f.nro_factu) as 'Cantidad de veces' , max(f.fecha) as 'Ultima visita' from dbo.facturas f , dbo.clientes c where c.nom_clie like 'Abarca%'

Se quiere saber el importe total vendido y el importe promedio vendido para números de factura que no sean los siguientes: 13, 5, 17, 33, 24.

select sum(d.cant*pre_unit)as 'Importe total' , avg(d.cant*d.pre_unit) 'Importe promedio' from dbo.detalle d, dbo.facturas f where d.nro_factu= f.nro_factu and f.nro_factu not in (13,5,17,33,29)

Page 14: Ejercicios SQL

----------------------------------------------------

VISTAS

EJERCICIOS:

Cree las siguientes vistas:

Detalle_Ventas_Vendedor: Liste la fecha, la factura, el codigo y nombre del vendedor, el articulo, la cantidad e importe, para lo que va del año. Rotule como FECHA, NRO_FACTURA, CODIGO_VENDEDOR, OMBRE_VENDEDOR, ARTICULO, CANTIDAD, IMPORTE.

create view [Detalle_ventas_vendedor] as ( select f.fecha as FECHA, f.nro_factu as NRO_FACTURA, v.cod_vend as CODIGO_VENDEDOR, v.nom_vend as NOMBRE_VENDEDOR, a.descripcion as ARTICULO, d.cant as CANTIDAD, (d.pre_unit*d.cant) as IMPORTE from facturas f, vendedores v, articulos a, detalle d where year (fecha) = 2009)

select * from [Detalle_ventas_vendedor]

Subtotales_Ventas_Vendedor: Se quiere saber el importe vendido y la cantidad de ventas por vendedor. Rotule como VENDEDOR, IMPORTE_VENDIDO, CANTIDAD_VENDIDA.

create view [subtotales_ventas_vendedor] as ( select count (v.cod_vend) as CANTIDAD_VENTAS, v.nom_vend , sum(d.pre_unit*d.cant) as IMPORTE

Page 15: Ejercicios SQL

from facturas f, detalle d, vendedores v where f.cod_vend = v.cod_vend and f.nro_factu = d.nro_factu group by v.nom_vend )

select * from [subtotales_ventas_vendedor]

Modifique las vistas según el siguientes detalle: La vista creada en el punto b, agréguele la condición de que solo tome lo del año en curso y que también muestre el promedio vendido y el código del vendedor.

alter view [subtotales_ventas_vendedor] as ( select count (v.cod_vend) as CANTIDAD_VENTAS, v.nom_vend , sum(d.pre_unit*d.cant) as IMPORTE, avg(d.pre_unit*d.cant) as PROMEDIO_VENDIDO, v.cod_vend from facturas f, detalle d, vendedores v where f.cod_vend = v.cod_vend and f.nro_factu = d.nro_factu and year (fecha) = 2009 group by v.nom_vend, v.cod_vend)

select * from [subtotales_ventas_vendedor]

Consulta las vistas según el siguiente detalle: Llame a la vista creada en el punto 1.a pero filtrando por importes inferiores a $20.

select * from [Detalle_ventas_vendedor] where IMPORTE <= 20

Llame a la vista creada en el punto 1.b filtrando para el vendedor Miranda.

select * from [subtotales_ventas_vendedor] where nom_vend like 'Miranda%'

Llama a la vista creada en el punto 1.b filtrando para promedios superiores a 100.

Page 16: Ejercicios SQL

select * from [subtotales_ventas_vendedor] where PROMEDIO_VENDIDO > 40

Elimine las vistas creadas en el punto 1 (no se olvide de colocar el nombre como corresponde)

drop view [Detalle_ventas_vendedor] drop view [subtotales_ventas_vendedor]

----------------------------------------------------

PROCEDIMIENTOS ALMACENADOS

EJERCICIOS:

Cree los siguientes SP:

LEGAJO-Detalle_Ventas: liste la fecha, la factura, el vendedor, el cliente, el artículo, cantidad e importe. Este SP recibirá como parámetros de E un rango de fechas.

create procedure detalle_venta @fecha1 as smalldatetime, @fecha2 as smalldatetime as select f.fecha, f.nro_factu, v.nom_vend, c.nom_clie, a.descripcion, d.cant, (d.cant*d.pre_unit) from clientes c, facturas f, vendedores v, articulos a, detalle d where f.nro_factu = d.nro_factu and c.cod_clie = f.cod_clie and a.cod_arti = d.cod_arti and v.cod_vend = f.cod_vend and fecha between @fecha1 and @fecha2

execute detalle_venta '20/03/2008','13/11/2009'

CantidadArt_Cli : este SP me debe devolver la cantidad de artículos o clientes (según se pida)

Page 17: Ejercicios SQL

que existen en la empresa.

create procedure CantidadArt_Clie @opcion1 int as begin if (@opcion1 = 1) select count (*) from Articulos as Articulos else select count (*) from Clientes as Clientes end

execute CantidadArt_Clie '1'

INS_Vendedor: Cree un SP que le permita insertar registros en la tabla vendedores.

create procedure INS_Vendedores @cod_vend as int output, @nom_vend as nvarchar (50), @dir as nvarchar (50), @nro_tel as int, @e_mail as nvarchar (50), @fec_nac as smalldatetime as begin insert into vendedores (nom_vend, direccion, nro_tel, fec_nac) values (@nom_vend, @dir, @nro_tel, @fec_nac) set @cod_vend = @@identity end

declare @a as int execute INS_Vendedores @a output, 'Pedro Perez', 'Lavalleja 250', 4205889, null, '20/03/2001'

UPD_Vendedor: cree un SP que le permita modificar un vendedor cargado.

create procedure UPD_Vendedor @cod_vend int, @nom_vend nvarchar (50), @dir nvarchar (50), @nro_tel int,

Page 18: Ejercicios SQL

@correo nvarchar (50), @fec_nac smalldatetime as update vendedores set nom_vend = @nom_vend, direccion = @dir, nro_tel = @nro_tel, [e-mail]= @correo, fec_nac = @fec_nac where cod_vend = @cod_vend

execute UPD_Vendedor 12, 'Pedro Perez', 'Lavalleja 250', 4205889, null, '20/03/2001'

DEL_Vendedor: cree un SP que le permita eliminar un vendedor ingresado.

create procedure DEL_Vendedores @cod_vend as int as delete from vendedores where cod_vend = @cod_vend

exec DEL_Vendedores '13'