Práctica 1

Anuncio
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Práctica 1
Objetivos de aprendizaje:
• Funcionamiento de la sentencia select y sus cláusulas select, from y where.
• Uso del modificador distinct.
• Expresiones en las cláusulas select y where.
Ejercicios:
1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos de euro.
Resultado: 3 filas.
Ayuda: Uso de expresiones en la cláusula select.
Solución:
select codart, 2 * precio
from
articulos
where precio < 0.05 ;
2. Obtener el código de factura y de artículo de las líneas de factura en las que la cantidad solicitada es
menor de 2 unidades y además se ha aplicado un descuento del 50% o mayor.
Resultado: 35 filas.
Ayuda: Uso del operador and.
Solución:
select
from
where
and
codfac, codart
lineas_fac
cant < 2
dto >= 50 ;
3. Obtener la descripción de los artículos cuyo stock está por debajo de su stock mínimo, dando también
la cantidad en unidades necesaria para que el stock alcance dicho mínimo.
Resultado: 2 filas.
Ayuda: Uso de expresiones en la cláusula select.
Solución:
select descrip, stock_min - stock
from
articulos
where stock < stock_min ;
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
4. Ivas distintos aplicados en las facturas del cliente cuyo código es 93.
Resultado: 3 filas.
Ayuda: Uso del modificador distinct.
Solución:
select distinct iva
from
facturas
where codcli = 93 ;
Ejercicios de autoevaluación:
5. Obtener la descripción de los artículos cuyo stock es más de tres veces su stock mínimo y cuyo
precio supera los 6 euros.
Resultado: 7 filas.
Ayuda: Uso de expresiones en el where.
Solución:
select
from
where
and
descrip
articulos
stock > 3 * stock_min
precio > 6 ;
6. Código de los artículos (sin que salgan repetidos) comprados en aquellas facturas cuyo código está
entre 8 y 10.
Resultado: 14 filas.
Ayuda: Uso de expresiones en el where.
Solución:
select distinct codart
from
lineas_fac
where codfac >= 8 and codfac <= 10 ;
2
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Práctica 2
Objetivos de aprendizaje:
•
•
Tratamiento de valores nulos y uso de la función nvl.
Manejo de funciones y operadores avanzados de SQL y Oracle: substr, upper, like, decode, to_char,
sysdate, etc.
Ejercicios:
1. Código, descripción y stock mínimo de los artículos de los que se desconoce la cantidad en stock.
Cuando se desconoce la cantidad en stock de un artículo, el stock es nulo.
Resultado: 20 filas.
Ayuda: Uso del operador is null.
Solución:
select codart, descrip, stock_min
from
articulos
where stock is null ;
2. Código, fecha y descuento de las facturas sin iva (iva nulo o cero). Visualizar un cero cuando el
descuento sea nulo.
Resultado: 294 filas.
Ayuda: Uso de la función nvl en el select y en el where.
Solución:
select codfac, fecha, nvl( dto, 0 )
from
facturas
where nvl( iva, 0 ) = 0 ;
3. Visualizar un listado de los artículos de menos de un euro con su código y un mensaje que indique la
situación de su stock. Cuando el stock sea superior al stock mínimo hay que escribir ‘STOCK
SUFICIENTE’, si es igual escribir ‘STOCK AJUSTADO’, y si el stock mínimo es mayor que el
stock, escribir el mensaje ‘STOCK INSUFICIENTE’.
Resultado: 157 filas.
Ayuda: Uso de la función decode.
3
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Solución:
select codart, decode( sign( stock – stock_min ),
1, ‘STOCK SUFICIENTE’,
0, ‘STOCK AJUSTADO’,
‘STOCK INSUFICIENTE’ )
from
articulos
where precio < 1;
4. Nombre de las provincias cuya segunda letra es una “O” (bien mayúscula o minúscula) y cuya última
letra es una “A” (bien mayúscula o minúscula).
Resultado: 3 filas.
Ayuda: Uso de las funciones substr, upper y length.
Solución:
select
from
where
and
nombre
provincias
upper( substr( nombre, 2, 1 ) ) = 'O'
upper( substr( nombre, length( nombre ), 1 ) ) = 'A' ;
5. Código y fecha de las facturas del año pasado para aquellos clientes cuyo código termina en 0.
Resultado: 26 filas.
Ayuda: Uso de las función mod, de la función sysdate y de la función to_char con el formato de
fecha yyyy.
Solución:
select
from
where
and
codfac, fecha
facturas
mod( codcli, 10 ) = 0
to_number( to_char( fecha, ‘yyyy’ ) ) =
to_number( to_char( sysdate, ‘yyyy’ ) ) – 1 ;
6. Nombre de los meses (sin que salgan repetidos) del año pasado en los que hay alguna factura de los
clientes cuyos códigos son menores que 10.
Resultado: 6 filas.
Ayuda: Uso del modificador distinct y del formato de fecha month.
Solución:
select
from
where
and
distinct to_char( fecha, ‘month’ )
facturas
codcli < 10
to_number( to_char( fecha, ‘yyyy’ ) ) =
to_number( to_char( sysdate, ‘yyyy’ ) ) – 1 ;
4
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
7. Código y fecha de las facturas de los primeros veinte días del año pasado para aquellos clientes cuyo
código se encuentra entre 100 y 250.
Resultado: 9 filas.
Ayuda: Uso del operador between y de los formatos de fecha ddd e yyyy.
Solución:
select
from
where
and
and
codfac, fecha
facturas
codcli between 100 and 250
to_number( to_char( fecha, ‘ddd’ ) ) <= 20
to_number( to_char( fecha, ‘yyyy’ ) ) =
to_number( to_char( sysdate, ‘yyyy’ ) ) – 1 ;
Ejercicios de autoevaluación:
8. Código y fecha de las facturas para los clientes cuyos códigos están entre 90 y 92 y o bien no se ha
aplicado descuento o bien no tienen iva. Nota: una factura no tiene iva cuando éste es cero o nulo.
Análogamente, una factura no tiene descuento cuando éste es cero o nulo.
Resultado: 8 filas.
Ayuda: Uso del operador between y los operadores and y or con paréntesis. No es lo mismo “a and b
or c” que “a and ( b or c )”.
Solución:
select
from
where
and
or
codfac, fecha
facturas
codcli between 90 and 92
( nvl( dto, 0 ) = 0
nvl( iva, 0 ) = 0 );
9. Código y fecha de las facturas que se han realizado durante el mes de marzo de cualquiera de los
últimos tres años (el año pasado y los dos anteriores).
Resultado: 44 filas.
Ayuda: Uso del formato de fecha mm.
Solución:
select
from
where
and
codfac, fecha
facturas
to_char( fecha, ‘mm’ ) = ‘03’
to_number( to_char( sysdate, ‘yyyy’ ) ) to_number( to_char( fecha, ‘yyyy’ ) ) between 1 and 3 ;
5
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
10. Nombre de las provincias que contienen el texto “MA” (bien mayúsculas o minúsculas) o cuyo
código comienza y termina por el mismo caracter.
Resultado: 11 filas.
Ayuda: Uso del operador like y de las funciones upper, substr y length.
Solución:
select nombre
from
provincias
where upper( nombre ) like ‘%MA%’
or upper( substr( codpro, 1, 1)) =
upper( substr( codpro, length( codpro ), 1 ) ) ;
11. Se desea promocionar los artículos de los que se posee un stock superior a 150 euros (número de
unidades en stock por precio). Si el artículo es de más de 30 euros se hará un descuento del 10%. Si
el artículo es de 30 euros o menos, se hará un descuento del 15%. Mostrar un listado de los artículos
que van a entrar en la promoción, con su código de artículo, precio actual y su descuento
correspondiente.
Resultado: 11 filas.
Ayuda: Uso de las funciones decode y sign.
Solución:
select codart, precio, decode(sign( precio - 30 ), 1, 10, 15 )
from
articulos
where stock * precio > 150 ;
6
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Práctica 3
Objetivos de aprendizaje:
•
Funciones de columna en la cláusula select.
Ejercicios:
1. Número de pueblos de la Comunidad Valenciana.
Resultado: 1663 pueblos.
Ayuda: Uso de la función count y del operador in. Los códigos postales de los pueblos de la
Comunidad Valenciana empiezan por ‘03’, ‘12’, y ‘46’.
Solución:
select count( * )
from
pueblos
where codpro in ( ‘03’, ‘12’, ‘46’ ) ;
2. Descuento medio aplicado en las facturas sin considerar los valores nulos.
Resultado: 17,8263274.
Ayuda: Uso de la función avg. Esta función ignora los valores nulos.
Solución:
select avg( dto )
from
facturas ;
3. Descuento medio aplicado en las facturas considerando los valores nulos como cero.
Resultado: 16,115.
Ayuda: Uso de la función avg. El uso de nvl evita saltar los valores nulos.
Solución:
select avg( nvl( dto, 0 ) )
from
facturas ;
select sum( dto ) / count( * )
from
facturas ;
4. Media mensual de facturas durante el año pasado.
Resultado: 18
7
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Ayuda: Este tipo de medias no puede calcularse con la función de columna avg, sino con
expresiones en el select.
Solución:
select count( * ) / 12
from
facturas
where to_number( to_char( fecha, ‘yyyy’ ) ) =
to_number( to_char( sysdate, ‘yyyy’ ) ) – 1 ;
5. Importe total de los artículos que tenemos en el almacén. Este importe se calcula sumando el
producto de las unidades en stock por el precio de cada unidad.
Resultado: 9.964.934,24 euros.
Ayuda: Uso de la función de columna sum aplicada a una expresión.
Solución:
select sum( stock * precio )
from
articulos ;
6. Número de pueblos en los que residen clientes cuyo código postal empieza por “12”.
Resultado: 11 pueblos.
Ayuda: Uso de la función count y del modificador distinct. El orden de estas dos palabras es muy
importante.
Solución:
select count( distinct codpue )
from
clientes
where codpostal like ‘12%’ ;
7. Valores máximo y mínimo del stock de los artículos cuyo precio oscila entre 9 y 12 euros y
diferencia entre ambos valores.
Resultado: 3 (máximo), 1 (mínimo) y 2 (diferencia).
Ayuda: Uso de expresiones de funciones de columna.
Solución:
select max( stock ), min( stock ), max( stock ) - min( stock )
from
articulos
where precio between 9 and 12 ;
8. Precio medio (con dos decimales) de los artículos cuyo stock supera las 15 unidades.
Resultado: 4,89 euros.
Ayuda: Uso de la función de columna avg sobre un subconjunto de datos de la tabla.
8
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Solución:
select round( avg( precio ), 2 )
from
articulos
where stock > 15 ;
9. Número medio de clientes por pueblo (sólo se deben considerar aquellos pueblos donde hay clientes).
Resultado: 1,25.
Ayuda: Este tipo de medias no puede calcularse con la función de columna avg.
Solución:
select count( * ) / count( distinct codpue )
from
clientes ;
10. Importe medio por factura (con dos decimales), sin considerar descuentos ni impuestos. El importe
de una factura se calcula sumando el producto de la cantidad por el precio de sus líneas.
Resultado: 384,49 euros.
Ayuda: Uso del modificador distinct y de las funciones de columna sum y count.
Solución:
select round( sum( cant * precio ) / count( distinct codfac ), 2 )
from
lineas_fac ;
11. Porcentaje de líneas cuyo descuento es nulo (con un decimal).
Resultado: 8,3 %.
Ayuda: Uso de la función de columna count. Se realiza restándole al 1el porcentaje de líneas cuyo
descuento no es nulo, y multiplicando el resultado por 100.
Solución:
select round( ( 1 - count( dto ) / count( * ) )* 100.0, 1 )
from
lineas_fac ;
Ejercicios de autoevaluación:
12. Número de clientes de los que hay facturas en el cuarto trimestre del año pasado.
Resultado: 45
Ayuda: Uso de la función de columna count.
9
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Solución:
select
from
where
and
count( distinct codcli )
facturas
to_number( to_char( fecha, ‘q’ ) ) = 4
to_number( to_char( fecha, ‘yyyy’ ) ) =
to_number( to_char( sysdate, ‘yyyy’ ) ) – 1 ;
13. Stock medio (con dos decimales), máximo, y mínimo de los artículos que contienen la letra A en la
segunda posición de su descripción., y cuyo stock mínimo es superior a la mitad de su stock actual.
Considerar que los artículos con stock nulo tienen un stock igual a cero.
Resultado: media 288,77
máximo 30469 mínimo 0
Ayuda: Uso de las funciones de columna.
Solución:
select round( avg( nvl( stock,
max( nvl( stock, 0 ) ),
from
articulos
where stock_min > nvl( stock,
and
upper( substr( descrip,
10
0 )), 2 ),
min(nvl( stock, 0 ) )
0 ) / 2
2, 1)) = ‘A’ ;
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Práctica 4
Objetivos de aprendizaje:
•
Agrupación de resultados y las cláusulas relacionadas group by y having.
•
Utilización de las funciones de columna en el select y en el having.
Ejercicios guiados:
1. Número de facturas para cada año. Junto con el año debe aparecer el número de facturas de ese año.
Resultado: 5 años (189, 182, 202, 211 y 216).
Ayuda: Uso de la función de columna count. Agrupación por una expresión.
Solución:
select to_char( fecha, 'yyyy' ), count( * )
from
facturas
group by to_char( fecha, 'yyyy' ) ;
2. Número de facturas de cada cliente, pero sólo se deben mostrar aquellos clientes que tienen más de
15 facturas.
Resultado: 5 filas.
Ayuda: Uso de la función de agrupación count. Agrupación de las facturas por código de cliente.
Solución:
select
from
group
having
codcli, count( * )
facturas
by codcli
count( * ) > 15 ;
3. Número de clientes del pueblo con mayor número de clientes.
Resultado: 10 clientes.
Ayuda: Uso de la función de columna max y de la función de agrupación count. Agrupación de los
clientes por código de pueblo.
Solución:
select max( count( * ) )
from
clientes
group by codpue ;
11
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
4. Cantidades totales vendidas para cada artículo cuyo código empieza por “F”. La cantidad total
vendida de un artículo se calcula sumando las cantidades de todas sus líneas de factura.
Resultado: 8 filas.
Ayuda: Uso de las función de agrupación sum. Agrupación de las líneas de artículos por código de
artículo.
Solución:
select
from
where
group
codart, sum( cant )
lineas_fac
upper( substr( codart, 1, 1 ) ) = ‘F’
by codart ;
5. Código de vendedor y número de facturas vendidas durante el año pasado, pero sólo para aquellos
vendedores con más de 3 facturas vendidas.
Resultado: 11 filas.
Ayuda: Uso de algunas restricciones en el where y otras en el having. Agrupación de las facturas por
código de vendedor.
Solución:
select codven, count( * )
from
facturas
where to_number( to_char( fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
group by codven
having count( * ) > 3 ;
6. Código de aquellos artículos de los que se ha facturado más de 6000 euros.
Resultado: 5 filas.
Ayuda: Uso de la función de agrupación sum. Agrupación de las líneas de facturas por código de
artículo.
Solución:
select
from
group
having
codart
lineas_fac
by codart
sum( cant * precio ) > 6000 ;
7. Número de facturas de cada uno de los clientes cuyo código está entre 241 y 250, con cada IVA
distinto que se les ha aplicado. En cada línea del resultado se debe mostrar un código de cliente, un
IVA y el número de facturas de ese cliente con ese IVA.
Resultado: 9 filas.
Ayuda: Uso de la función de agrupación count. Agrupación de las facturas por dos valores: código
de cliente e iva.
12
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Solución:
select
from
where
group
codcli, iva, count( * )
facturas
codcli between 241 and 250
by codcli, iva ;
8. Media del importe de las facturas, sin tener en cuenta impuestos ni descuentos.
Resultado: 384,48857.
Ayuda: Uso de la función de columna avg y de la función de agrupación sum. Agrupación de las
líneas de factura por código de factura.
Solución:
select avg( sum( cant*precio ) )
from
lineas_fac
group by codfac ;
Ejercicios de autoevaluación:
9. Precio máximo y precio mínimo de venta (precio de la tabla de líneas de facturas) para cada artículo
cuyo código empieza por “R”.
Resultado: 15 filas.
Ayuda: Uso simultáneo de las funciones de agrupación max y min. Agrupación de las líneas de
facturas por código de artículo.
Solución:
select
from
where
group
max( precio ), min( precio )
lineas_fac
upper( substr( codart, 1, 1 ) ) = ‘R’
by codart ;
10. Porcentaje de iva mínimo para cada mes del año pasado aplicado en las facturas realizadas por los
vendedores cuyo código se halla entre 100 y 200 (incluidos).
Resultado: 12 filas (7, 0, 7, 0, 7, 7, 0, 7, 7, 0, 0 y 7).
Ayuda: Uso de la función de agrupación min. Agrupación por una expresión.
Solución:
select to_char( fecha, 'mm' ), min( iva )
from
facturas
where to_number( to_char( fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
and
codven between 100 and 200
group by to_char( fecha, 'mm') ;
13
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
11. Importe de la factura con mayor importe, sin tener en cuenta impuestos ni descuentos.
Resultado: 6.255,86 euros.
Ayuda: Uso de la función de columna max y de la función de agrupación sum.
Solución:
select max( sum( cant * precio ) )
from
lineas_fac
group by codfac ;
14
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Práctica 5
Objetivos de aprendizaje:
•
Realización de consultas que involucren a más de una tabla.
•
Especificación de relaciones de concatenación (join) entre las columnas de varias tablas.
Ejercicios:
1. Nombre de cliente y nombre de pueblo de los clientes de la provincia de Soria.
Resultado: 1 fila.
Ayuda: Relación de concatenación entre tres tablas.
Solución:
select c.nombre as cliente, p.nombre as pueblo
from
clientes c join pueblos p using (codpue)
join provincias pr using (codpro)
where c.codpue = p.codpue
and
p.codpro = pr.codpro
and
upper( pr.nombre ) = 'SORIA';
select
from
where
and
and
c.nombre as cliente, p.nombre as pueblo
clientes c, pueblos p, provincias pr
c.codpue = p.codpue
p.codpro = pr.codpro
upper( pr.nombre ) = 'SORIA';
2. De cada factura del segundo semestre del año pasado hecha para un cliente de Castellón, mostrar el
código de la factura, el nombre del cliente y el nombre de su pueblo.
Resultado: 10 filas.
Ayuda: Relación de concatenación entre tres tablas.
Solución:
select f.codfac as factura, c.nombre as cliente,
p.nombre as pueblo
from
facturas f join clientes c using (codcli)
join pueblos p using (codpue)
where p.codpro = '12'
and
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate,'yyyy' ) ) - 1
and
to_number( to_char( f.fecha, 'mm' ) ) > 6 ;
select f.codfac
p.nombre
from
facturas
where f.codcli
as factura, c.nombre as cliente,
as pueblo
f, clientes c, pueblos p
= c.codcli
15
Ingeniería Informática. Universitat Jaime I.
and
and
and
and
c.codpue =
p.codpro =
to_number(
to_number(
to_number(
Bases de Datos. Práctica 1.
p.codpue
'12'
to_char( f.fecha, 'yyyy' ) ) =
to_char( sysdate,'yyyy' ) ) - 1
to_char( f.fecha, 'mm' ) ) > 6 ;
3. Número de pueblos de la provincia de Soria.
Resultado: 506 pueblos.
Ayuda: Relación de concatenación simple entre dos tablas. Uso de la función de columna count. No
es necesario agrupar dado que se pide un solo resultado.
Solución:
select count( * )
from
pueblos p join provincias pr using(codpro)
where upper( pr.nombre ) = 'SORIA';
select
from
where
and
count( * )
pueblos p, provincias pr
pr.codpro = p.codpro
upper( pr.nombre ) = 'SORIA';
4. Número de pueblos de la provincia de Castellón en los que tenemos algún cliente.
Resultado: 11 pueblos.
Ayuda: Concatenación de dos tablas. En cada pueblo puede haber más de un cliente.
Solución:
select count( distinct codpue )
from
clientes c join pueblos p using (codpue)
where p.codpro = '12' ;
select
from
where
and
count( distinct p.codpue )
clientes c, pueblos p
p.codpue = c.codpue
p.codpro = '12' ;
5. Para cada vendedor de la provincia de Castellón, mostrar su nombre y el nombre de su jefe
inmediato.
Resultado: 10 filas.
Ayuda: Relación de concatenación de una tabla consigo misma.
Solución:
select v1.nombre vendedor, v2.nombre jefe
from
vendedores v1 join pueblos p using (codpue)
join vendedores v2 on (v1.codjefe = v2.codven)
where
p.codpro = '12' ;
16
Ingeniería Informática. Universitat Jaime I.
select
from
where
and
and
Bases de Datos. Práctica 1.
v1.nombre vendedor, v2.nombre jefe
vendedores v1, vendedores v2, pueblos p
v1.codjefe = v2.codven
p.codpue = v1.codpue
p.codpro = '12' ;
6. Nombre de los pueblos de Castellón que se llaman igual que algún pueblo de otra provincia.
Resultado: 64 filas.
Ayuda: Concatenación de una tabla consigo misma. Especificación de relaciones de concatenación
diferentes a las de clave primaria/clave ajena.
Solución:
select distinct p1.nombre
from
pueblos p1 join pueblos p2
on upper( p1.nombre ) = upper( p2.nombre )
where p1.codpro = '12'
and
p2.codpro <> '12' ;
select
from
where
and
and
distinct p1.nombre
pueblos p1, pueblos p2
upper( p1.nombre ) = upper( p2.nombre )
p1.codpro = '12'
p2.codpro <> '12' ;
7. Pueblos de otras provincias que se llaman igual que alguno de los pueblos de la provincia de
Castellón. Para cada pueblo mostrar su nombre y el de su provincia.
Resultado: 168 filas.
Ayuda: Inverso del ejercicio anterior.
Solución:
select p2.nombre pueblo, pr.nombre provincia
from
pueblos p2
join provincias pr using (codpro)
join pueblos p1 on upper( p1.nombre ) = upper( p2.nombre )
where p1.codpro = ‘12’
and
codpro <> ‘12’ ;
select
from
where
and
and
and
p2.nombre pueblo, pr.nombre provincia
pueblos p1, pueblos p2, provincias pr
p2.codpro = pr.codpro
upper( p1.nombre ) = upper( p2.nombre )
p1.codpro = ‘12’
p2.codpro <> ‘12’ ;
Ejercicios de autoevaluación:
8. Código y fecha de cada factura del mes de diciembre del año pasado junto con todos los detalles de
su primera línea.
17
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Resultado: 17 filas.
Ayuda: Relación de concatenación entre dos tablas con condiciones sobre ambas tablas.
Solución:
select
from
where
and
and
codfac, f.fecha, l.linea, l.cant, l.codart, l.precio,l.dto
facturas f join lineas_fac l using (codfac)
l.linea = 1
to_char( f.fecha, 'mm' ) = '12'
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1;
select
from
where
and
and
and
f.codfac, f.fecha, l.*
facturas f, lineas_fac l
f.codfac = l.codfac
l.linea = 1
to_char( f.fecha, 'mm' ) = '12'
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1;
9. De cada factura de los primeros 15 días del mes de diciembre del año pasado mostrar el código,
fecha, nombre del cliente, nombre del pueblo, y de la provincia del mismo, así como el tipo de IVA
aplicado: normal (16), reducido (7) u otros.
Resultado: 7 filas ( 3 normal, 2 reducido, 2 otros ).
Ayuda: Uso de la función decode.
Solución:
select f.codfac factura, f.fecha fecha, c.nombre cliente,
p.nombre pueblo, pr.nombre provincia,
decode( iva, 16, 'normal', 7, 'reducido', 'otros' ) iva
from
facturas f join clientes c using (codcli)
join pueblos p using (codpue)
join provincias pr using (codpro)
where to_number( to_char( f.fecha, 'dd' ) ) <= 15
and
to_char( f.fecha, 'mm' ) = '12'
and
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1 ;
select f.codfac factura, f.fecha fecha, c.nombre cliente,
p.nombre pueblo, pr.nombre provincia,
decode( iva, 16, 'normal', 7, 'reducido', 'otros' ) iva
from
facturas f, clientes c, pueblos p, provincias pr
where c.codcli = f.codcli
and
p.codpue = c.codpue
and
pr.codpro = p.codpro
and
to_number( to_char( f.fecha, 'dd' ) ) <= 15
and
to_char( f.fecha, 'mm' ) = '12'
and
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1 ;
18
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
10. Descripción de los artículos cuyo precio ha aumentado más de un 10% durante el último trimestre del
año pasado. Junto con la descripción deben mostrarse el precio menor y el precio aumentado, ambos
con la fecha de la línea de factura en la que aparecen.
Resultado: 11 filas.
Ayuda: Relación de concatenación de una tabla consigo misma.
Solución:
select distinct a.descrip, l1.precio, f1.fecha, l2.precio, f2.fecha
from
articulos a join lineas_fac l1 using (codart)
join facturas f1 on (l1.codfac = f1.codfac)
join lineas_fac l2 using (codart)
join facturas f2 on (l2.codfac = f2.codfac)
where to_char( f1.fecha, 'q' ) = '4'
and
to_number( to_char( f1.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
and
to_char( f2.fecha, 'q' ) = '4'
and
to_number( to_char( f2.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
and
l2.precio > l1.precio * 1.1
and
f2.fecha > f1.fecha;
select distinct a.descrip, l1.precio, f1.fecha, l2.precio, f2.fecha
from
articulos a, lineas_fac l1, facturas f1,
lineas_fac l2, facturas f2
where a.codart = l1.codart
and
l1.codfac = f1.codfac
and
to_char( f1.fecha, 'q' ) = '4'
and
to_number( to_char( f1.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
and
a.codart = l2.codart
and
l2.codfac = f2.codfac
and
to_char( f2.fecha, 'q' ) = '4'
and
to_number( to_char( f2.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
and
l2.precio > l1.precio * 1.1
and
f2.fecha > f1.fecha;
19
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
Práctica 6
Objetivos de aprendizaje:
•
Realización de consultas que involucren a más de una tabla y con agrupación de resultados.
Ejercicios:
1. Mostrar el nombre de cada cliente y el número de unidades que ha comprado (suma de las cantidades
de las líneas de sus facturas), pero sólo si el total supera las 600 unidades.
Resultado: 4 filas.
Ayuda: Relación de concatenación entre tres tablas. Agrupación por código y nombre de cliente.
Restricción en la cláusula having.
Solución:
select c.nombre, sum( l.cant )
from
clientes c join facturas f using (codcli)
join lineas_fac l using (codfac)
group by codcli, c.nombre
having sum( l.cant ) >= 600 ;
select
from
where
and
group
having
c.nombre, sum( l.cant )
lineas_fac l, facturas f, clientes c
c.codcli = f.codcli
f.codfac = l.codfac
by c.codcli, c.nombre
sum( l.cant ) >= 600 ;
2. Nombre, código postal y facturación (suma de las cantidades por los precios de las líneas de sus
facturas), sin tener en cuenta impuestos ni descuentos, de aquellos clientes que han facturado igual o
más de 6000 euros.
Resultado: 12 filas.
Ayuda: Relación de concatenación entre tres tablas. Uso de agrupaciones adicionales (por codcli,
nombre y código postal) y restricción de grupos.
Solución:
select c.nombre, c.codpostal, sum( l.cant * l.precio )
from
clientes c join facturas f using (codcli)
join lineas_fac l using (codfac)
group by codcli, c.nombre, c.codpostal
having sum( l.cant * l.precio ) >= 6000 ;
select c.nombre, c.codpostal, sum( l.cant * l.precio )
from
lineas_fac l, facturas f, clientes c
where c.codcli = f.codcli
20
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
and
f.codfac = l.codfac
group by c.codcli, c.nombre, c.codpostal
having sum( l.cant * l.precio ) >= 6000 ;
3. Código y nombre de los vendedores que han vendido 8 o más artículos distintos cuyo código
comienza por la letra B (mayúscula o minúscula). Mostrar, además, para cada vendedor el número de
artículos distintos.
Resultado: 7 filas.
Ayuda: Concatenación de tres tablas y agrupación por vendedor.
Solución:
select codven, v.nombre, count( distinct l.codart )
from
vendedores v join facturas f using (codven)
join lineas_fac l using (codfac)
where upper( l.codart ) like 'B%'
group by codven, v.nombre
having count( distinct l.codart ) >= 8 ;
select
from
where
and
and
group
having
v.codven, v.nombre, count( distinct l.codart )
vendedores v, facturas f, lineas_fac l
v.codven = f.codven
f.codfac = l.codfac
upper( l.codart ) like 'B%'
by v.codven, v.nombre
count( distinct l.codart ) >= 8 ;
4. Nombre de cada cliente de la provincia de Castellón con su dirección completa, además del número
de facturas que ha realizado durante el año pasado.
Resultado: 6 filas.
Ayuda: Concatenación de 4 tablas con dos restricciones adicionales. Agrupación para contar las
facturas para cada cliente. Si se compara este resultado con el número de clientes de la
provincia de Castellón, se aprecia que no han salido aquellos clientes que no tienen ninguna
factura. En la siguiente práctica se aprenderá a que aparezcan todos los clientes, aunque no
tengan facturas.
Solución:
select c.nombre cliente, c.direccion direccion,
c.codpostal codpostal, p.nombre pueblo,
pr.nombre provincia, count( * ) NumFacturas
from
facturas f join clientes c using (codcli)
join pueblos p using (codpue)
join provincias pr using (codpro)
where codpro = '12'
and
to_number( to_char( f.fecha,'yyyy' ) ) =
to_number( to_char( sysdate,'yyyy' ) ) - 1
group by codcli, c.nombre, c.direccion, c.codpostal,
p.nombre, pr.nombre ;
select c.nombre cliente, c.direccion direccion,
c.codpostal codpostal, p.nombre pueblo,
pr.nombre provincia, count( * ) NumFacturas
from
facturas f, clientes c, pueblos p, provincias pr
21
Ingeniería Informática. Universitat Jaime I.
where
and
and
and
and
group
Bases de Datos. Práctica 1.
c.codcli = f.codcli
p.codpue = c.codpue
pr.codpro = p.codpro
pr.codpro = '12'
to_number( to_char( f.fecha,'yyyy' ) ) =
to_number( to_char( sysdate,'yyyy' ) ) - 1
by c.codcli, c.nombre, c.direccion, c.codpostal,
p.nombre, pr.nombre ;
5. Nombre de las provincias en las que tenemos más de 5 clientes, mostrando el número de clientes de
cada una de ellas.
Resultado: Baleares (11), Castellón (37), Madrid (7) y Valencia (8).
Ayuda: Concatenación de tres tablas y agrupación con cláusulas group by y having.
Solución:
select pr.nombre provincia, count( * ) clientes
from
clientes c join pueblos p using (codpue)
join provincias pr using (codpro)
group by codpro, pr.nombre
having count( * ) > 5;
select
from
where
and
group
having
pr.nombre provincia, count( * ) clientes
clientes c, pueblos p, provincias pr
p.codpue = c.codpue
pr.codpro = p.codpro
by pr.codpro, pr.nombre
count( * ) > 5;
6. Código y nombre de los clientes preferentes del mes de diciembre del año pasado. Son clientes
preferentes de un mes aquellos que han solicitado más de 60 euros en facturas durante ese mes (sin
considerar descuentos ni IVA).
Resultado: 11 filas.
Ayuda: Concatenación de tres tablas. Agrupación por código de cliente. Restricciones en la cláusula
where y en la cláusula having.
Solución:
select codcli codigo, c.nombre cliente
from
clientes c join facturas f using (codcli)
join lineas_fac l using (codfac)
where to_char( f.fecha,'mm' ) = '12'
and
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
group by codcli, c.nombre
having sum( l.cant * l.precio ) > 60;
select
from
where
and
and
and
c.codcli codigo, c.nombre cliente
lineas_fac l, facturas f, clientes c
c.codcli = f.codcli
f.codfac = l.codfac
to_char( f.fecha,'mm' ) = '12'
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
22
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
group by c.codcli, c.nombre
having sum( l.cant * l.precio ) > 60;
Ejercicios de autoevaluación:
7. Número de clientes de cada pueblo de la Comunidad Valenciana (códigos de provincia '12', '46', '03');
dar el nombre del pueblo y el de la provincia.
Resultado: 23 filas.
Ayuda: Relación de concatenación de tres tablas y utilización de la cláusula group by.
Solución:
select p.nombre pueblo, pr.nombre provincia, count( * ) clientes
from
clientes c join pueblos p using (codpue)
join provincias pr using (codpro)
where codpro in ( '12', '46','03' )
group by codpue, p.nombre, codpro, pr.nombre;
select
from
where
and
and
group
p.nombre pueblo, pr.nombre provincia, count( * ) clientes
pueblos p, clientes c, provincias pr
p.codpue = c.codpue
pr.codpro = p.codpro
p.codpro in ( '12', '46','03' )
by p.codpue, p.nombre, pr.codpro, pr.nombre;
8. Para actualizar los valores mínimos del stock de cada artículo se debe obtener la cantidad media que
se ha comprado al mes, considerando sólo las compras del último trimestre del año pasado, y
aumentar dicha cantidad en un 2 %. Obtener la descripción de los artículos cuyo stock mínimo esté
por debajo del deseado, mostrando el stock mínimo y la cantidad que se desea tener en stock
(redondear esta cantidad al entero mayor o igual con la función ceil).
Resultado: 122 filas.
Ayuda: Uso de la función ceil. La cantidad media que se ha comprado al mes no se calcula con la
función avg.
Solución:
select codart, a.descrip, a.stock_min,
ceil( 1.02*( sum( l.cant )/3 ) ) nuevo_stock
from
articulos a join lineas_fac l using (codart)
join facturas f using (codfac)
where to_char( fecha, 'q' ) = '4'
and
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
group by codart, a.descrip, a.stock_min
having a.stock_min < ceil( 1.02 * ( sum( l.cant ) / 3 ) );
select a.codart, a.descrip, a.stock_min,
ceil( 1.02*( sum( l.cant )/3 ) ) nuevo_stock
from
articulos a, lineas_fac l, facturas f
where a.codart = l.codart
and
f.codfac = l.codfac
23
Ingeniería Informática. Universitat Jaime I.
Bases de Datos. Práctica 1.
and
and
to_char( fecha, 'q' ) = '4'
to_number( to_char( f.fecha, 'yyyy' ) ) =
to_number( to_char( sysdate, 'yyyy' ) ) - 1
group by a.codart, a.descrip, a.stock_min
having a.stock_min < ceil( 1.02 * ( sum( l.cant ) / 3 ) );
24
Descargar