Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas

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 (25) - Generar modelo 347



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

En esta entrada resolveremos el punto 22:
Generar listado de Clientes y Proveedores para generar el modelo 347 (3005,06 €).


Se trata de generar un listado en el que se incluyan los clientes y proveedores que sobrepasen la cantidad facturada (IVA incluido) de 3005,06 € (lo que se corresponde, exactamente, con las antiguas 500000 pts).


Se realizará una consulta a siete tablas (Ivas, Articulos, lineas y cabeceras tanto de facturas de venta como de albaranes de compra, clientes y proveedores )




Dada la complejidad del listado, se puede facilitar el proceso dividiéndolo en dos partes. Por una parte se buscarán los datos necesarios para los clientes y en otra para los proveedores, que luego se unirán en un único listado mediante UNION.

Para obtener los clientes, la consulta se hará a cuatro tablas.



Se podrá aprovechar la solución del punto 13 (Ver totales de cliente entre fechas)

Para poder diferenciar entre clientes y proveedores se añadirá un campo literal, que permitirá diferenciar entre unos y otros una vez unidas las consultas.

select clientes.id_cliente as id, nombre, nif,
round(sum(neto * cantidad * ((100.0 + tipo_iva) / 100.0)),2) as total, 
"cliente" as tipo
from clientes left join cab_fv
on clientes.id_cliente = cab_fv.id_cliente
left join lin_fv
on cab_fv.id_fv = lin_fv.id_fv
inner join ivas
on lin_fv.iva = ivas.codigo_iva
where cab_fv.fecha between "2012-01-01" and "2012-12-31"
group by clientes.id_cliente;


Para obtener los proveedores, la consulta es similar a la anterior solo que cambiando los campos por los correspondientes a las tablas de proveedores y albaranes de compra.


select proveedores.id_proveedor as id, nombre, nif,
round(sum(neto * cantidad * ((100.0 + tipo_iva) / 100.0)),2) as total, 
"proveedor" as tipo
from proveedores left join cab_ac
on proveedores.id_proveedor = cab_ac.id_proveedor
left join lin_ac
on cab_ac.id_ac = lin_ac.id_ac
inner join ivas
on lin_ac.iva = ivas.codigo_iva
where cab_ac.fecha between "2012-01-01" and "2012-12-31"
group by proveedores.id_proveedor;




Una vez que se tienen las dos consultas solo es preciso unirlas mediante la cláusula UNION.


select clientes.id_cliente as id, nombre, nif,
round(sum(neto * cantidad * ((100.0 + tipo_iva) / 100.0)),2) as total, 
"cliente" as tipo
from clientes left join cab_fv
on clientes.id_cliente = cab_fv.id_cliente
left join lin_fv
on cab_fv.id_fv = lin_fv.id_fv
inner join ivas
on lin_fv.iva = ivas.codigo_iva
where cab_fv.fecha between "2012-01-01" and "2012-12-31"
group by clientes.id_cliente

UNION

select proveedores.id_proveedor as id, nombre, nif,
round(sum(neto * cantidad * ((100.0 + tipo_iva) / 100.0)),2) as total, 
"proveedor" as tipo
from proveedores left join cab_ac
on proveedores.id_proveedor = cab_ac.id_proveedor
left join lin_ac
on cab_ac.id_ac = lin_ac.id_ac
inner join ivas
on lin_ac.iva = ivas.codigo_iva
where cab_ac.fecha between "2012-01-01" and "2012-12-31"
group by proveedores.id_proveedor;



El resultado es una consulta de 23 líneas.


NOTA: Una posible solución para simplificar esta consulta y facilitar su reutilización es crear una vista, mediante CREATE VIEW, para obtener los clientes, otra para los proveedores y finalmente unir ambas en una sola consulta.

Creación de la vista de clientes:

create view clientes347
(id, nombre, nif, total, tipo)
as
select clientes.id_cliente, nombre, nif,
round(sum(neto * cantidad * ((100.0 + tipo_iva) / 100.0)),2), 
"cliente"
from clientes left join cab_fv
on clientes.id_cliente = cab_fv.id_cliente
left join lin_fv
on cab_fv.id_fv = lin_fv.id_fv
inner join ivas
on lin_fv.iva = ivas.codigo_iva
where cab_fv.fecha between "2012-01-01" and "2012-12-31"
group by clientes.id_cliente;

Si se realiza un select de esta vista se obtiene como resultado el mismo que ejecutando la consulta completa:

select * from clientes347;


Creación de la vista de proveedores:

create view proveedores347
(id, nombre, nif, total, tipo)
as
select proveedores.id_proveedor, nombre, nif,
round(sum(neto * cantidad * ((100.0 + tipo_iva) / 100.0)),2), 
"proveedor"
from proveedores left join cab_ac
on proveedores.id_proveedor = cab_ac.id_proveedor
left join lin_ac
on cab_ac.id_ac = lin_ac.id_ac
inner join ivas
on lin_ac.iva = ivas.codigo_iva
where cab_ac.fecha between "2012-01-01" and "2012-12-31"
group by proveedores.id_proveedor;

Si se realiza un select de esta vista se obtiene como resultado el mismo que ejecutando la consulta completa:

select * from proveedores347;



Y finalmente para obtener el listado completo, solo será preciso realizar la unión entre ambas vistas. Recordemos que SQL trata a las vistas como si fuesen tablas.

select * from clientes347
UNION
select * from proveedores347;


sábado, 15 de diciembre de 2012

Resolución ejercicio final (24) - Eliminar artículos descatalogados.


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

En esta entrada resolveremos el punto 21:
Eliminar artículos descatalogados.


Se eliminarán todos los artículos que tengan el valor true en el campo Descatalogado.

Se realizará una consulta a una única tabla (Articulos)



El campo Descatalogado se ha creado como tipo BOOL, se constara que realmente se almacena como un valor de tipo TINYINT.




Comprobamos que artículos están descatalogados.


select id_articulo, nombre, descatalogado
from articulos
where descatalogado = true;



delete from articulos
where descatalogado = true;


Comprobamos nuevamente los artículos descatalogados.

select id_articulo, nombre, descatalogado
from articulos
where descatalogado = true;


Como se puede ver ahora en la base de datos ya no existen artículos descatalogados. Se muestra un EMPTY SET. 


NOTA: Una cuestión a tener en cuenta, es que las bases de datos no eliminan realmente los datos que se borran, de tal manera que eliminar datos de una Base de Datos, no implica una reducción del tamaño del fichero en disco.

Concretamente en MySQL existe un concepto conocido como residuo, que es la cantidad de espacio que se está usando que podría ser reducido de la Base de Datos.

Por ejemplo con phpMyAdmin, al seleccionar la Base de Datos se muestra un listado con las tablas y el residuo que se puede depurar.


Según la imagen anterior en la tabla artículos se pueden depurar 64 Bytes.

Para recuperar este espacio, seleccionar la tabla artículos, acceder a la opción Operaciones y seleccionar la opción "Optimizar la tabla" (Se realizar la operación equivalente a compactar en Microsoft Access)



viernes, 14 de diciembre de 2012

Resolución ejercicio final (22) - Actualizar precios de Artículos.




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

En esta entrada resolveremos el punto 19:
Actualizar precios de Artículos.

Se solicitará la familia y se actualizarán todos los artículos de la familia.

Se realizará una consulta a una única tabla (Articulos)


Estado original:



update articulos set neto = neto * 1.10
where familia = "bebidas";



Estado final:



NOTA: Al modificar los precios en una base de datos se suele producir un aumento de decimales en los precios, por lo que suele ser común redondear los precios mediante la función ROUND..