Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el...

24
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 codfac, codart from lineas_fac where cant < 2 and 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 ;

Transcript of Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el...

Page 1: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

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 codfac, codart from lineas_fac where cant < 2 and 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 ;

Page 2: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

2

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 descrip from articulos where stock > 3 * stock_min and 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 ;

Page 3: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

3

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.

Page 4: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

4

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 nombre from provincias where upper( substr( nombre, 2, 1 ) ) = 'O' and 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 codfac, fecha from facturas where mod( codcli, 10 ) = 0 and 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 distinct to_char( fecha, ‘month’ ) from facturas where codcli < 10 and to_number( to_char( fecha, ‘yyyy’ ) ) = to_number( to_char( sysdate, ‘yyyy’ ) ) – 1 ;

Page 5: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

5

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 codfac, fecha from facturas where codcli between 100 and 250 and to_number( to_char( fecha, ‘ddd’ ) ) <= 20 and 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 codfac, fecha from facturas where codcli between 90 and 92 and ( nvl( dto, 0 ) = 0 or 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 codfac, fecha from facturas where to_char( fecha, ‘mm’ ) = ‘03’ and to_number( to_char( sysdate, ‘yyyy’ ) ) - to_number( to_char( fecha, ‘yyyy’ ) ) between 1 and 3 ;

Page 6: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

6

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 ;

Page 7: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

7

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

Page 8: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

8

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.

Page 9: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

9

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.

Page 10: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

10

Solución: select count( distinct codcli ) from facturas where to_number( to_char( fecha, ‘q’ ) ) = 4 and 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, 0 )), 2 ), max( nvl( stock, 0 ) ), min(nvl( stock, 0 ) ) from articulos where stock_min > nvl( stock, 0 ) / 2 and upper( substr( descrip, 2, 1)) = ‘A’ ;

Page 11: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

11

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 codcli, count( * ) from facturas group by codcli having 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 ;

Page 12: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

12

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 codart, sum( cant ) from lineas_fac where upper( substr( codart, 1, 1 ) ) = ‘F’ group 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 codart from lineas_fac group by codart having 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.

Page 13: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

13

Solución: select codcli, iva, count( * ) from facturas where codcli between 241 and 250 group 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 max( precio ), min( precio ) from lineas_fac where upper( substr( codart, 1, 1 ) ) = ‘R’ group 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') ;

Page 14: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

14

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 ;

Page 15: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

15

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 c.nombre as cliente, p.nombre as pueblo from clientes c, pueblos p, provincias pr where c.codpue = p.codpue and p.codpro = pr.codpro and 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 as factura, c.nombre as cliente, p.nombre as pueblo from facturas f, clientes c, pueblos p where f.codcli = c.codcli

Page 16: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

16

and c.codpue = p.codpue and 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 ;

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 count( * ) from pueblos p, provincias pr where pr.codpro = p.codpro and 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 count( distinct p.codpue ) from clientes c, pueblos p where p.codpue = c.codpue and 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' ;

Page 17: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

17

select v1.nombre vendedor, v2.nombre jefe from vendedores v1, vendedores v2, pueblos p where v1.codjefe = v2.codven and p.codpue = v1.codpue and 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 distinct p1.nombre from pueblos p1, pueblos p2 where upper( p1.nombre ) = upper( p2.nombre ) and p1.codpro = '12' and 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 p2.nombre pueblo, pr.nombre provincia from pueblos p1, pueblos p2, provincias pr where p2.codpro = pr.codpro and upper( p1.nombre ) = upper( p2.nombre ) and p1.codpro = ‘12’ and 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.

Page 18: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

18

Resultado: 17 filas.

Ayuda: Relación de concatenación entre dos tablas con condiciones sobre ambas tablas.

Solución: select codfac, f.fecha, l.linea, l.cant, l.codart, l.precio,l.dto from facturas f join lineas_fac l using (codfac) where l.linea = 1 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, f.fecha, l.* from facturas f, lineas_fac l where f.codfac = l.codfac and l.linea = 1 and to_char( f.fecha, 'mm' ) = '12' and 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 ;

Page 19: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

19

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;

Page 20: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

20

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 c.nombre, sum( l.cant ) from lineas_fac l, facturas f, clientes c where c.codcli = f.codcli and f.codfac = l.codfac group by c.codcli, c.nombre having 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

Page 21: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

21

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 v.codven, v.nombre, count( distinct l.codart ) from vendedores v, facturas f, lineas_fac l where v.codven = f.codven and f.codfac = l.codfac and upper( l.codart ) like 'B%' group by v.codven, v.nombre having 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

Page 22: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

22

where c.codcli = f.codcli and p.codpue = c.codpue and pr.codpro = p.codpro and pr.codpro = '12' and to_number( to_char( f.fecha,'yyyy' ) ) = to_number( to_char( sysdate,'yyyy' ) ) - 1 group 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 pr.nombre provincia, count( * ) clientes from clientes c, pueblos p, provincias pr where p.codpue = c.codpue and pr.codpro = p.codpro group by pr.codpro, pr.nombre having 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 c.codcli codigo, c.nombre cliente from lineas_fac l, facturas f, clientes c where c.codcli = f.codcli and f.codfac = l.codfac and to_char( f.fecha,'mm' ) = '12' and to_number( to_char( f.fecha, 'yyyy' ) ) = to_number( to_char( sysdate, 'yyyy' ) ) - 1

Page 23: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

23

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 p.nombre pueblo, pr.nombre provincia, count( * ) clientes from pueblos p, clientes c, provincias pr where p.codpue = c.codpue and pr.codpro = p.codpro and p.codpro in ( '12', '46','03' ) group 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

Page 24: Práctica 1 - Universitat Jaume Iaramburu/II18/soluciones1-6.pdf · Ejercicios: 1. Obtener el código y el doble del precio de los artículos cuyo precio es inferior a 5 céntimos

Ingeniería Informática. Universitat Jaime I. Bases de Datos. Práctica 1.

24

and to_char( fecha, 'q' ) = '4' and 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 ) );