miércoles, 19 de diciembre de 2012

Resolución ejercicio final (31) - Listar Artículos de un tipo de IVA.

RESOLUCIÓN DEL PUNTO 29 DEL ENUNCIADO DEL EJERCICIO FINAL.

En esta entrada resolveremos el punto 29:
Listar Artículos de un tipo de IVA.

Esta consulta se puede resolver con una única tabla, si se conoce el código asociado al IVA, en caso de no conocerlo, será preciso utilizar dos tablas (artículos e ivas).
En primer lugar se resuelve la consulta a partir de código de IVA.

En este caso se obtendrán los artículos del código de IVA 3.

select * from articulos where codigo_iva = 3;

En segundo lugar se resuelve la consulta a partir del tipo de IVA.

En este caso se obtendrán los artículos del IVA 10%.
select articulos.*

from articulos inner join ivas
on articulos.codigo_iva = ivas.codigo_iva
where ivas.tipo_iva = 10;

Resolución ejercicio final (30) - Listar ventas de artículos entre fechas a un cliente determinado a partir de su DNI/CIF.





RESOLUCIÓN DEL PUNTO 28 DEL ENUNCIADO DEL EJERCICIO FINAL.

En esta entrada resolveremos el punto 28:
Listar ventas de artículos entre fechas a un cliente determinado a partir de su DNI/CIF.

Se trata de generar un listado con las cantidades de artículos vendidos entre dos fechas.

Es una consulta a dos o tres tablas dependiendo de si se desea obtener el id del artículo (3 tablas) o también su descripción (4 tablas).


Se filtrarán mediante la cláusula WHERE las líneas de factura que no cumplan con las fechas, luego estos datos serán agrupados mediante el id del artículo, a este filtro se le añadirá mediante una Y lógica (AND) la condición de que cumpla un nif determinado.

select lin_fv.id_articulo, articulos.nombre, sum(lin_fv.cantidad) as total
from lin_fv inner join cab_fv
on lin_fv.id_fv = cab_fv.id_fv
left join articulos
on lin_fv.id_articulo = articulos.id_articulo
left join clientes
on cab_fv.id_cliente = clientes.id_cliente
where cab_fv.fecha between "2012-11-01" and "2012-12-01" and
clientes.nif = "11111111A"
group by id_articulo
order by total desc;



NOTA: Se ordena el resultado de forma descendiente, mediante ORDER BY TOTAL DESC, para tener de primero el artículo más vendido.

Resolución ejercicio final (29) - Listar ventas de artículos entre fechas a un cliente determinado a partir de su id.




RESOLUCIÓN DEL PUNTO 27 DEL ENUNCIADO DEL EJERCICIO FINAL.

En esta entrada resolveremos el punto 27:
Listar ventas de artículos entre fechas a un cliente determinado a partir de su id.


Se trata de generar un listado con las cantidades de artículos vendidos entre dos fechas.

Es una consulta a dos o tres tablas dependiendo de si se desea obtener el id del artículo (2 tablas) o también su descripción (3 tablas).


Se filtrarán mediante la cláusula WHERE las líneas de factura que no cumplan con las fechas, luego estos datos serán agrupados mediante el id del artículo, a este filtro se le añadirá mediante una Y lógica (AND) la condición para que salgan datos solo de un cliente por id.

select lin_fv.id_articulo, articulos.nombre, sum(lin_fv.cantidad) as total
from lin_fv inner join cab_fv
on lin_fv.id_fv = cab_fv.id_fv
left join articulos
on lin_fv.id_articulo = articulos.id_articulo
where cab_fv.fecha between "2012-11-01" and "2012-12-01" and
cab_fv.id_cliente = 1
group by id_articulo
order by total desc;


NOTA: Se ordena el resultado de forma descendiente, mediante ORDER BY TOTAL DESC, para tener de primero el artículo más vendido.

Resolución ejercicio final (28) - Listar ventas de artículos entre fechas.




RESOLUCIÓN DEL PUNTO 26 DEL ENUNCIADO DEL EJERCICIO FINAL.

En esta entrada resolveremos el punto 26:
Listar ventas de artículos entre fechas.

Se trata de generar un listado con las cantidades de artículos vendidos entre dos fechas.

Es una consulta a dos o tres tablas dependiendo de si se desea obtener el id del artículo (2 tablas) o también su descripción (3 tablas).

Se filtrarán mediante la cláusula WHERE las líneas de factura que no cumplan con las fechas, luego estos datos serán agrupados mediante el id del artículo.

select lin_fv.id_articulo, articulos.nombre, sum(lin_fv.cantidad) as total
from lin_fv inner join cab_fv
on lin_fv.id_fv = cab_fv.id_fv
left join articulos
on lin_fv.id_articulo = articulos.id_articulo
where cab_fv.fecha between "2012-11-01" and "2012-12-01"
group by id_articulo
order by total desc;


NOTA: Se ordena el resultado de forma descendiente, mediante ORDER BY TOTAL DESC, para tener de primero el artículo más vendido.

martes, 18 de diciembre de 2012

Resolución ejercicio final (27) - Listar los clientes de una población determinada.



RESOLUCIÓN DEL PUNTO 25 DEL ENUNCIADO DEL EJERCICIO FINAL.

En esta entrada resolveremos el punto 25:
Listar los clientes de una población determinada.

Se trata de generar un listado de todos los clientes de una población.

Es una consulta a una única tabla.


Select * from clientes where poblacion = "pontevedra";


NOTA: Lo único a destacar de esta consulta es que, como se puede observar en el resultado de la consulta, SQL es CASE INSENSITIVE, lo que quiere decir que no distingue mayúsculas de minúsculas.

Resolución ejercicio final (27) - Listar los clientes que han comprado un artículo determinado.


RESOLUCIÓN DEL PUNTO 24 DEL ENUNCIADO DEL EJERCICIO FINAL.

En esta entrada resolveremos el punto 24:
Listar los clientes que han comprado un artículo determinado.


Se trata de generar un listado de todos los cliente que han comprado un artículo determinado, definido mediante su id.

Una consulta de este tipo podría ser útil en el caso de haber vendido un producto defectuoso, y desear ponerse en contacto con ellos.

Si se parte del id del artículo, se trata de una consulta a tres tablas, en caso de partir de la descripción o del código de barras habría que añadir la tabla artículos a la consulta.




select distinct clientes.*
from clientes right join cab_fv
on clientes.id_cliente = cab_fv.id_cliente
inner join lin_fv
on cab_fv.id_fv = lin_fv.id_fv
where lin_fv.id_articulo = 8;


NOTA: Se incluye la subcláusula DISTINCT para evitar duplicados en el listado final. 

Resolución ejercicio final (26) - Listar los proveedores de los que ha comprado artículos un cliente determinado.

RESOLUCIÓN DEL PUNTO 23 DEL ENUNCIADO DEL EJERCICIO FINAL.

En esta entrada resolveremos el punto 23:
Listar los proveedores de los que ha comprado artículos un cliente determinado.

Se trata de generar un listado en el que se incluyan los proveedores de los productos que ha comprado un cliente.

Para resolverlo se utilizará una subconsulta, que proporcionará el listado de los ids de los artículos que ha comprado el cliente, mientras que otra consulta localizará los proveedores que nos han vendido esos artículos.


Como primer paso se creará una subconsulta que obtenga el nombre de los proveedores de un artículo determinado a partir de su id_articulo.


select distinct proveedores.id_proveedor, proveedores.nombre
from lin_ac inner join cab_ac
on lin_ac.id_ac = cab_ac.id_ac 
inner join proveedores
on cab_ac.id_proveedor = proveedores.id_proveedor
where id_articulo = 8;


Esta consulta devolverá los nombres de los proveedores del artículo de id 8.

Pero sería más útil si se le pudiese indicar varios ids simultáneamente.

Para ello se modifica la consulta cambiando el operador de comparación de la cláusula WHERE por el operador IN, que realiza una operación similar pero sobre un conjunto de datos.

La consulta queda finalmente como se indica a continuación:

select distinct proveedores.id_proveedor, proveedores.nombre
from lin_ac inner join cab_ac
on lin_ac.id_ac = cab_ac.id_ac 
inner join proveedores
on cab_ac.id_proveedor = proveedores.id_proveedor
WHERE id_articulo IN (8, 21, 350);


Esta consulta devolverá los nombres de los proveedores de los artículos de id 8, 21 y 350; en este caso se añade a la salida un nuevo proveedor.

Como segundo paso se creará otra consulta que obtendrá  los ids de todos los artículos comprados por un cliente.

Estos ids serán suministrados a la consulta anterior dentro de la cláusula IN.


select id_articulo
from lin_fv inner join cab_fv
on lin_fv.id_fv = cab_fv.id_fv
where cab_fv.id_cliente = 1;


La salida de esta consulta es un listado de ids de los artículos que ha comprado un cliente.

Se puede observar que los ids pueden salir repetidos.

Podría parecer útil añadir la subcláusula DISTINCT para que no existiesen repeticiones, pero se debe tener en cuenta que para eliminar los duplicados se le obliga a la Base de Datos a realizar una ordenación de los registros por el campo en que se desean eliminar los duplicados, y esta operación es una de las más lentas que se le pueden solicitar a una Base de Datos.

Por otra parte estos datos serán usados dentro de una cláusula IN, lo que hace innecesario la eliminación de duplicados.

La consulta final quedaría como se indica a continuación:


select distinct proveedores.id_proveedor, proveedores.nombre
from lin_ac inner join cab_ac
on lin_ac.id_ac = cab_ac.id_ac 
inner join proveedores
on cab_ac.id_proveedor = proveedores.id_proveedor
where id_articulo in (select id_articulo
from lin_fv inner join cab_fv
on lin_fv.id_fv = cab_fv.id_fv
where cab_fv.id_cliente = 2)
order by 1;



NOTA: Para facilitar la lectura del listado se ha añadido al final una cláusula ORDER BY 1, lo que indica que el resultado se ordene por el primer campo mostrado.