|
Solución ejercicios tema
4. Las consultas de resumen
|
|
SELECT AVG(cuota)
AS cuota_media, AVG(ventas) AS ventas_media
FROM empleados
|
Sale una única fila con el resultado deseado.
Siempre que se utilicen expresiones o funciones en la lista de selección,
queda mejor utilizar un alias de columna para que ese aparezca en el encabezado
del resultado.
|
|
SELECT AVG(importe)
AS importe_medio, SUM(importe) AS importe_total, AVG(importe/cant) AS
precio_venta_medio
FROM pedidos
|
El precio medio de venta es la media aritmética
de los precios unitarios de cada pedido. El precio unitario se calcula
dividiendo el importe del pedido por la cantidad del pedido: importe/cant,
por lo que ponemos AVG(importe/cant).
|
|
SELECT AVG(precio)
AS p_medio_ACI
FROM productos
WHERE idfab = 'ACI'
|
Ahora no nos interesan todos los productos sino unicamente
los del fabricante ACI, por lo que añadimos la cláusula
WHERE para que antes de calcular la media, elimine del origen de datos
los registros que no cumplan la condición.
|
|
SELECT SUM(importe)
AS total_pedidos_V_Pantalla
FROM empleados INNER JOIN pedidos ON empleados.numemp = pedidos.rep
WHERE nombre = 'Vicente Pantalla'
|
El importe total lo tenemos que sacar de la tabla de
pedidos, y además sólo nos interesan los de Vicente Pantalla.
Como nos dan el nombre del representante en vez de su número y
en el pedido sólo tenemos el número de representante tenemos
que añadir a las líneas de cada pedido, los datos del representante
correspondiente, por lo que el origen de datos debe ser el que aparece
en la FROM.
|
|
SELECT MIN(fechapedido)
AS primer_pedido
FROM pedidos
|
La fecha del primer pedido es la fecha más antigua
de la tabla de pedidos.
|
|
SELECT COUNT(*)
AS cuantos_pedidos_mayores
FROM pedidos
WHERE importe > 25000
|
Se podía haber utilizado también COUNT(numpedido)
o cualquier nombre de columna que no pueda contener valores nulos, pero
COUNT(*) es mejor por ser más rápido (la diferencia se nota
con tablas muy voluminosas).
|
|
SELECT oficina,
COUNT(*) AS cuantos_empleados
FROM empleados
GROUP BY oficina
|
Con esta solución obtenemos el listado pedido
pero no aparecen las oficinas que no tienen empleados asignados ya que
sacamos la información de la tabla empleados y aparece una fila
con valor nulo en oficina que contiene el número de empleados que
no tienen oficina. Si quisieramos listar incluso las que no tengan empleados
habría que recurrir a la solución 2
|
|
Solución
2
SELECT oficinas.oficina, COUNT(numemp) AS cuantos_empleados
FROM empleados RIGHT JOIN oficinas ON empleados.oficina = oficinas.oficina
GROUP BY oficinas.oficina
|
Utilizamos un RIGHT JOIN para que el origen de datos
incluya también una fila por cada oficina que no tenga empleados.
En el GROUP BY y en la lista de selección hay que indicar el campo
oficina de la tabla oficinas, si ponemos el de la tabla empleados, agrupará
todas las oficinas que no tienen empleados en una fila (la columna empleados.oficina
contiene valor nulo para esas filas).
Aquí no podemos utilizar COUNT(*) por que las oficinas sin empleados
aparecerían con 1 en la columna cuantos_empleados ya que para esa
oficina hay una fila.
|
|
SELECT numemp, nombre,
clie AS cliente, SUM(importe) AS total_vendido
FROM empleados INNER JOIN pedidos ON pedidos.rep = empleados.numemp
GROUP BY numemp, nombre, clie
|
Necesitamos la tabla de pedidos para el importe vendido
a qué cliente, necesitamos la tabla empleados para el nombre del
representante, la de clientes no la necesitamos ya que nos piden el número
de cliente y este está en pedidos.
La agrupación básica que debemos realizar es por numemp
y después por clie, pero como aparece el nombre del empleado en
la lista de selección, hay que incluirlo también en el GROUP
BY.
Después de determinar la agrupación básica que nos
hace falta, siempre que se incluye una columna adicional en el GROUP BY
hay que comprobar que esa nueva columna no cambia la agrupación
básica.
Por ejemplo no podríamos añadir al GROUP BY la columna fechapedido
ya que se formarían más grupos.
|
|
Solución
2
SELECT numemp, nombre, clie AS cliente, SUM(importe) AS total_vendido
FROM empleados LEFT JOIN pedidos ON pedidos.rep = empleados.numemp
GROUP BY numemp, nombre, clie
|
Si queremos que salgan todos los empleados incluso
los que no aparezcan en los pedidos habría que sustituir el INNER
por un LEFT.
|
|
SELECT rep, AVG(importe)
AS importe_medio
FROM pedidos
GROUP BY rep
HAVING SUM(importe) > 30000
|
No queremos todos los empleados, unicamente los que
tengan un importe total pedido superior a 30.000, luego tenemos que poner
la condición SUM(importe) > 30000. Como esta condición
contiene una función de columna (SUM()) se tiene que poner en la
cláusula HAVING ya que selecciona filas de la tabla resultante
no del origen de datos.
|
|
SELECT descripcion,
precio, SUM(importe) AS total_pedido
FROM productos INNER JOIN pedidos ON pedidos.fab = productos.idfab AND
pedidos.producto = productos.idproducto
GROUP BY idfab, idproducto, descripcion, precio, existencias
HAVING SUM(importe) > existencias * 0.75
ORDER BY 3
|
La agrupación básica es por idfab e idproducto
ya que son los dos campos que conjuntamente identifican un producto.
Como descripción y precio aparecen en la lista de selección
y no modifican la agrupación básica los incluimos en el
GROUP BY.
Como existencias aparece en el HAVING y no modifica
la agrupación básica lo incluimos también el el GROUP
BY.
Para calcular el 75% de las existencias multiplicamos
existencias por 0,75; observar que en la sentencia SQL hay que utilizar
el punto para indicar los decimales.
Para indicar la columna de ordenación no podemos
utilizar el alias campo, utilizamos el número de orden de la columna
dentro de la lista de selección. En este caso la suma de importes
es la tercera columna.
|
|
Consulta:
distintas_oficinas
SELECT DISTINCT oficina
FROM empleados
WHERE ventas > cuota
Consulta: sumaria11
SELECT COUNT(*) AS
cuantas_oficinas
FROM distintas_oficinas
|
Si contamos las oficinas directamente de la tabla empleados
nos salen 9 oficinas ya que la función COUNT(nb columna) cuenta
los valores no nulos pero los valores repetidos los cuenta tantas veces
como se repiten, como tenemos oficinas de se repiten en la columna oficina
de la tabla oficinas, esas oficinas son contadas varias veces, hay que
contar los valores distintos.
En otros SQL la función COUNT puede llevar delante del nombre de
la columna la cláusula DISTINCT que indica que sólo se tienen
que tener en cuenta valores distintos (no cuenta los repetidos), por ejemplo
COUNT(DISTINCT oficina), es una opción muy útil que desgraciadamente
no incluye el SQL de Microsoft JET. Para solucionar el problema se resuelve
con dos consultas, una con la cual nos quedamos con los valores distintos
(en la solución la consulta se llama distintas_oficinas), y la
otra que nos cuenta esos valores.
|
| |
|
|
|
Aviso legal: este curso es gratuito
siempre que se visualice desde la página web de aulaClic. No está permitido descargar el curso y utilizarlo en academias o centros de enseñanza
privados sin estar conectado a Internet.
|
© aulaClic. Todos los derechos reservados.
Free Computer tutorials .
Prohibida la reproducción por cualquier medio.
Junio -2001.aulaClic.com
|
|
|