Está en la página 1de 4

1 Listar los nombres de los clientes que tienen asignado el representante

Alvaro Jaumes (suponiendo que no pueden haber representantes con el


mismo nombre).

SELECT nombre Hemos supuesto que no pueden haber dos


FROM clientes empleados con el mismo nombre, de lo contrario
WHERE repclie = (SELECT numemp habría que añadir ANY antes de la subconsulta.
FROM empleados WHERE nombre =
'Alvaro Jaumes' );

2 Listar los vendedores (numemp, nombre, y nº de oficina) que trabajan en


oficinas "buenas" (las que tienen ventas superiores a su objetivo).

Solución 1 Con esta solución buscamos que la oficina del


SELECT numemp, nombre, oficina empleado esté en la lista de oficinas que tienen
FROM empleados ventas superiores a su objetivo.
WHERE oficina IN ( SELECT oficina
FROM oficinas WHERE ventas >
objetivo );

Solución 2 Con esta solución buscamos que exista una


SELECT numemp, nombre, oficina oficina igual al del empleado y que tenga ventas
FROM empleados superiores a su objetivo. El resultado será el
WHERE EXISTS ( SELECT * FROM mismo que con la solución 1.
oficinas WHERE empleados.oficina =
oficinas.oficina AND ventas >
objetivo );

Solución 3 Con esta otra comparamos la oficina del


SELECT numemp, nombre, oficina empleado con cada una de las oficinas que
FROM empleados tengan ventas superiores a su objetivo, si la
WHERE oficina = ANY ( SELECT oficina del empleado es igual a alguna de esas
oficina FROM oficinas WHERE oficinas aparece el empleado en el resultado. El
ventas > objetivo ); resultado será el mismo que con la solución 1.
3 Listar los vendedores que no trabajan en oficinas dirigidas por el
empleado 108.

Solución 1 Obtenemos los empleados tales que no exista


SELECT numemp, nombre, oficina una oficina igual a la suya que además esté
FROM empleados dirigida por el empleado 108, con esta solución sí
WHERE NOT EXISTS ( SELECT * aparecen los empleados que no tienen oficina.
FROM oficinas WHERE
empleados.oficina = oficinas.oficina
AND dir = 108);

SELECT numemp, nombre, oficina Con la subconsulta obtenemos la lista de las


FROM empleados oficinas dirigidas por el empleado 108. Al final se
WHERE oficina NOT IN ( SELECT obtienen los empleados cuya oficina no esté en
oficina FROM oficinas WHERE dir = esa lista, es decir salen los empleados asignados
108); a una oficina no dirigida por el 108. Pero no salen
los empleados que no tienen oficina asignada ya
que su campo oficina es nulo por lo que el
resultado de la comparación es nulo, no es
verdadero y no se seleccionan. El problema se
puede arreglar indicando que también se tienen
que seleccionar los empleados con oficina nula:

Solución 2 Con la subconsulta obtenemos la lista de las


SELECT numemp, nombre, oficina oficinas dirigidas por el empleado 108. Al final se
FROM empleados obtienen los empleados cuya oficina no esté en
WHERE ( oficina NOT IN ( SELECT esa lista. Pero no salen los empleados que no
oficina FROM oficinas WHERE dir = tienen oficina asignada ya que su campo oficina
108) ) OR ( oficina IS NULL); es nulo por lo que el resultado de la comparación
es nulo, no es verdadero y no se seleccionan.

SELECT numemp, nombre, oficina Con esta solución tenemos el mismo problema
FROM empleados que con NOT IN , cuando la oficina del empleado
WHERE oficina <> ALL ( SELECT es nula todos los resultados de las
oficina FROM oficinas WHERE dir = comparaciones individuales son nulos por los que
108); el test ALL da nulo y no se seleccionan los
empleados con oficina nula.
4 Listar los productos (idfab, idproducto y descripción) para los cuales no se
ha recibido ningún pedido de 25000 o más.

SELECT idfab, idproducto, En este caso es más cómodo utilizar NOT


descripcion EXISTS ya que hay que preguntar por
FROM productos el idfab e idproducto a la vez.
WHERE NOT EXISTS (SELECT *
FROM pedidos WHERE fab = idfab
AND producto = idproducto AND
importe >= 25000);

5 Listar los clientes asignados a Ana Bustamante que no han remitido un


pedido superior a 3000 pts.

SELECT numclie, nombre Como utilizamos NOT IN debemos asegurarnos


FROM clientes de que la subconsulta no devuelva nulos. En este
WHERE repclie IN ( SELECT numemp caso clie es un campo de pedidos que admite
FROM empleados WHERE nombre = nulos por lo que tenemos que añadir en el
'Ana Bustamante' ) WHERE de la subconsulta AND clie IS NOT
AND numclie NOT IN ( SELECT clie NULL.
FROM pedidos WHERE importe >
3000 AND clie IS NOT NULL);

6 Listar las oficinas en donde haya un vendedor cuyas ventas representen


más del 55% del objetivo de su oficina.

SELECT * En una subconsulta todos los campos no


FROM oficinas cualificados se presuponen de la tabla origen de
WHERE EXISTS ( SELECT * FROM la subconsulta y sólo si no existe ninguna
empleados WHERE columna con ese nombre, la considera como
empleados.oficina=oficinas.oficina referencia externa, por eso no es necesario
AND ventas > objetivo * 0.55); cualificar ventas porque interpreta que es el
campo ventas de la tabla empleados.
7 Listar las oficinas en donde todos los vendedores tienen ventas que
superan al 50% del objetivo de la oficina.

SELECT * Si un empleado no tiene ventas queremos que no


FROM oficinas sea tomado en cuenta, por eso añadimos AND
WHERE (objetivo * 0.5) <= ALL ( ventas IS NOT NULL. Además esta solución no
SELECT ventas FROM empleados vale porque salen las oficinas que no tienen
WHERE empleados.oficina = empleados.
oficinas.oficina AND ventas IS NOT Hay que añadir una condición para que se
NULL); consideren sólo las oficinas con empleados como
muestra la solución 1.

Solución 1
SELECT *
FROM oficinas
WHERE ((objetivo * 0.5) <= ALL (
SELECT ventas FROM empleados
WHERE empleados.oficina =
oficinas.oficina AND ventas IS NOT
NULL) )
AND ( EXISTS ( SELECT * FROM
empleados WHERE
empleados.oficina = oficinas.oficina )
);

Solución 2 Esta es otra posible solución, calculamos la


SELECT * menor venta de los empleados de la oficina y si
FROM oficinas esta es mayor que el 50% del ojetivo de la oficina
WHERE (objetivo * .5) <= (SELECT quiere decir que todos los empleados de esa
MIN(ventas) FROM empleados oficina tienen ventas iguales o superiores. Si la
WHERE empleados.oficina = oficina no tiene empleados, la subconsulta no
oficinas.oficina); devuelve ninguna fila y como estamos utilizando
una comparación simple el resultado es nulo,
luego no salen las oficinas que no tienen
empleados. Esta solución es mucho más corta y
elegante.

8 Listar las oficinas que tengan un objetivo mayor que la suma de las cuotas
de sus vendedores.

SELECT *
FROM oficinas
WHERE objetivo > ( SELECT
SUM(cuota) FROM empleados
WHERE empleados.oficina =
oficinas.oficina);

También podría gustarte