PDA

Ver la Versión Completa : Consultas en SQL


eennzzoo
05-11-2014, 00:40:03
Hola tengo las siguientes tablas y tengo dificultad en resolver las consultas.


create table productos (cod_prod smallint not null,
descripcion varchar(30) not null,
marca varchar (30) not null,
stok int not null,
stock_min int not null,
precio float not null,
cod_grupo smallint not null,
cod_familia smallint not null,
primary key (cod_prod),
foreign key (cod_grupo) references grupo(cod_grupo),
foreign key (cod_familia) references familia(cod_familia))
create table proveedores (cod_prov smallint not null,
nombre varchar (30) not null,
telefono int not null,
direccion varchar (30) not null,
fax int not null,
primary key (cod_prov))
create table pedidos (num_pedido smallint not null,
cod_prov smallint not null,
cod_prod smallint not null,
fecha date not null,
nombre_contacto varchar (30) not null,
primary key (num_pedido),
foreign key (cod_prov) references proveedores(cod_prov),
foreign key (cod_prod) references productos(cod_prod))
create table clientes (dni int not null,
nombre varchar(30) not null,
apellido varchar(30) not null,
direccion varchar (30) not null,
telefono varchar(11) not null,
primary key (dni))
create table compras (num_factura_compra smallint not null,
fecha_compra date not null,
fecha_venc date not null,
importe_total float not null,
forma_de_pago varchar(30) check (forma_de_pago in ('Efectivo','Tarjeta de crédito','Tarjeta de débito','Cuenta Corriente')),
dni int not null,
primary key (num_factura_compra),
foreign key (dni) references clientes (dni))
create table facturas (num_factura smallint not null,
fecha date not null,
importe_total float not null,
cod_prov smallint not null,
cod_prod smallint not null,
primary key (num_factura),
foreign key (cod_prov) references proveedores(cod_prov),
foreign key (cod_prod) references productos(cod_prod))
create table familia (cod_familia smallint not null,
tipo varchar(30) not null,
primary key (cod_familia))
create table grupo (cod_grupo smallint not null,
tipo varchar (30) not null,
cod_familia smallint not null,
primary key (cod_grupo),
foreign key (cod_familia) references familia(cod_familia))
create table pagos (num_pago smallint not null,
fecha date not null,
saldo float not null,
num_factura_compra smallint not null,
primary key (num_pago),
foreign key (num_factura_compra) references compras(num_factura_compra))
create table detallefactura (num_factura smallint not null,
cod_prov smallint not null,
cantidad int not null,
foreign key (num_factura) references facturas(num_factura),
foreign key (cod_prov) references proveedores(cod_prov))
create table detallecompra (num_factura_compra smallint not null,
cod_prod smallint not null,
cantidad smallint not null,
foreign key (cod_prod) references productos(cod_prod),
foreign key (num_factura_compra) references compras(num_factura_compra))

insert into clientes (dni, nombre, apellido, direccion, telefono)
values (33666888, 'Carlos', 'Sanchez', 'Corrientes 526','3435626983')
insert into proveedores (cod_prov, nombre, telefono ,direccion, fax)
values (1, 'Pedro', 343262659, 'Miguel David', 545466468)
insert into proveedores (cod_prov, nombre, telefono ,direccion, fax)
values (2, 'Julian', 343562995, 'Almafuerte 899', 122364548)
insert into familia (cod_familia, tipo)
values (1, 'Limpieza')
insert into familia (cod_familia, tipo)
values (2, 'Bebidas')
insert into grupo (cod_grupo, tipo, cod_familia)
values (1, 'Detergente', 1)
insert into grupo (cod_grupo, tipo, cod_familia)
values (2, 'Agua', 2)
insert into grupo (cod_grupo, tipo, cod_familia)
values (3, 'Gaseosas', 2)
insert into productos (cod_prod, descripcion, marca, stok, stock_min, precio, cod_grupo, cod_familia)
values (1, 'Aguas minerales', 'Villavicencio', 20, 5, 15.5, 2, 2)
insert into productos (cod_prod, descripcion, marca, stok, stock_min, precio, cod_grupo, cod_familia)
values (2, 'Gaseosas', 'Pepsi', 50, 10, 19, 3, 2)
insert into compras (num_factura_compra, fecha_compra, fecha_venc, importe_total,forma_de_pago, dni)
values (80, '20/12/2014', '20/12/2015', 500, 'Efectivo', 33666888)
insert into compras (num_factura_compra, fecha_compra, fecha_venc, importe_total,forma_de_pago, dni)
values (85, '20/11/2014', '20/12/2014', 20, 'Efectivo', 33666888)
insert into compras (num_factura_compra, fecha_compra, fecha_venc, importe_total,forma_de_pago, dni)
values (90, '20/01/2015', '20/06/2015', 100, 'Cuenta Corriente', 33666888)
insert into detallecompra (num_factura_compra, cod_prod, cantidad)
values (80,1,2)
insert into detallecompra (num_factura_compra, cod_prod, cantidad)
values (80,2,3)
insert into detallecompra (num_factura_compra, cod_prod, cantidad)
values (90,2,4)
insert into detallecompra (num_factura_compra, cod_prod, cantidad)
values (85,2,5)
insert into pagos (num_pago, fecha, saldo, num_factura_compra)
values (30, '23/06/2015', 500, 80)
insert into pagos (num_pago, fecha, saldo, num_factura_compra)
values (40, '26/02/2015', 350, 90)
insert into facturas (num_factura, fecha, importe_total, cod_prov, cod_prod)
values (40, '15/10/2014', 1000, 1, 1)
insert into detallefactura (num_factura, cod_prov, cantidad)
values (40, 1, 24)
insert into pedidos (num_pedido, fecha, nombre_contacto, cod_prod, cod_prov)
values (70, '30/06/2014', 'Alberto', 2, 1)
insert into pedidos (num_pedido, fecha, nombre_contacto, cod_prod, cod_prov)
values (75, '30/09/2014', 'Alberto', 1, 2)
insert into pedidos (num_pedido, fecha, nombre_contacto, cod_prod, cod_prov)
values (76, '30/09/2014', 'Alberto', 2, 2)


CONSULTAS:

--Código, descripción y cantidad de productos vendidos durante un mes dado

--Operaciones de un cliente dado durante un período indicado

--Saldo en cuenta corriente de un cliente dado

--Detalle de operaciones en cuenta corriente de un cliente dado

--Datos de proveedores que suministran aguas minerales y gaseosas

--Datos y cantidades de productos más vendidos durante un mes dado.

--Ganancia obtenida en un período dado.

--Medios de pagos más utilizados en el último trimestre.

--Totales de compras realizadas por familias y grupos de productos.

Casimiro Notevi
05-11-2014, 01:10:50
Recuerda poner los tags al código fuente, ejemplo:

http://www.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

mamcx
05-11-2014, 01:13:04
Por favor lee la guia de estilo (http://clubdelphi.com/foros/guiaestilo.php).

Has hecho un curso de SQL? Conoces de bases de datos relacionales?

Hace un tiempo dicte un curso con la ayuda de este sitio:

http://www.devjoker.com/gru/Tutorial-de-Transact-SQL/TSQL/Tutorial-de-Transact-SQL.aspx


--
P.D: Para que te quede claro: Es mejor hacer de a una sola pregunta a la vez. Debes mostrar que has intentado. Deben haber ejemplos de codigo y de *datos*.

eennzzoo
05-11-2014, 01:35:55
Por favor lee la guia de estilo (http://clubdelphi.com/foros/guiaestilo.php).

Has hecho un curso de SQL? Conoces de bases de datos relacionales?

Hace un tiempo dicte un curso con la ayuda de este sitio:

http://www.devjoker.com/gru/Tutorial-de-Transact-SQL/TSQL/Tutorial-de-Transact-SQL.aspx


--
P.D: Para que te quede claro: Es mejor hacer de a una sola pregunta a la vez. Debes mostrar que has intentado. Deben haber ejemplos de codigo y de *datos*.

Hola, si estoy dando sobre base de datos en la facultad pero muy poco sobre sql.

Casimiro Notevi
05-11-2014, 02:05:16
Aquí tienes un tutorial en línea, muy sencillo:
http://www.desarrolloweb.com/manuales/9/

Neftali [Germán.Estévez]
05-11-2014, 15:47:18
Iba a decir que perecen los deberes de clase, cuando has colocado tu segundo mensaje.
Deberías intentar hacer alguna de las consultas y colocarla aquí (lo que te salga), y en ese caso intentaremos ayudarte, pero poner directamente los deberes aquí para que los resolvamos, no parece muy correcto. :(:(

Intenta hacer alguna y pregunta sobre lo que tengas dudas o no entiendas.

eennzzoo
05-11-2014, 16:08:43
Iba a decir que perecen los deberes de clase, cuando has colocado tu segundo mensaje.
Deberías intentar hacer alguna de las consultas y colocarla aquí (lo que te salga), y en ese caso intentaremos ayudarte, pero poner directamente los deberes aquí para que los resolvamos, no parece muy correcto. :(:(

Intenta hacer alguna y pregunta sobre lo que tengas dudas o no entiendas.



--Código, descripción y cantidad de productos vendidos durante un mes dado
select productos.cod_prod, descripcion, detallecompra.cantidad
from productos, detallecompra, compras
where fecha_compra between '01/12/2014' and '31/12/2014'
group by productos.cod_prod, descripcion


--Operaciones de un cliente dado durante un período indicado
select dni, forma_de_pago
from compras
where fecha_compra between '01/12/2014' and '31/12/2014'


--Saldo en cuenta corriente de un cliente dado
select saldo, dni
from pagos, compras
where pagos.num_factura_compra = compras.num_factura_compra and forma_de_pago = 'Cuenta Corriente'


--Detalle de operaciones en cuenta corriente de un cliente dado
select *
from compras
where forma_de_pago = 'Cuenta Corriente'


--Datos de proveedores que suministran aguas minerales y gaseosas
select *
from proveedores
where cod_prov in
(select cod_prov
from pedidos
where cod_prod in
(select cod_prod
from productos
where descripcion = 'Gaseosas' or descripcion = 'Aguas minerales'))


--Datos y cantidades de productos más vendidos durante un mes dado.
select marca, count(*) as [Total de productos vendidos]
from productos, detallecompra, compras
where detallecompra.cod_prod = productos.cod_prod and MONTH(fecha_compra)=11
group by marca
order by (COUNT(*)) desc


--Ganancia obtenida en un período dado.
select sum (importe_total) as [Ganancia]
from compras
where fecha_compra between '01/12/2014' and '31/12/2014'


--Medios de pagos más utilizados en el último trimestre.
select forma_de_pago, COUNT(*) as [Veces que fue utilizado]
from compras
where fecha_compra between '01/10/2014' and '31/12/2014'
group by forma_de_pago


--Totales de compras realizadas por familias y grupos de productos.
select count(*) as [Total], familia.tipo as [Tipo de familia], grupo.tipo as [Tipo de grupo]
from grupo, familia, detallecompra, productos
where grupo.cod_grupo = productos.cod_grupo and familia.cod_familia = productos.cod_familia and detallecompra.cod_prod = productos.cod_prod
group by familia.tipo, grupo.tipo

Casimiro Notevi
05-11-2014, 16:38:02
¿Y cuál es el problema?

Neftali [Germán.Estévez]
05-11-2014, 17:44:32
[SQL]

Mucho mejor... ^\||/

¿Y cuál es el problema?

Eso digo yo.
¿Te dan error?
¿No salen los datos?

Neftali [Germán.Estévez]
05-11-2014, 18:09:23
Revisando un poco....


--Código, descripción y cantidad de productos vendidos durante un mes dado
select productos.cod_prod, descripcion, detallecompra.cantidad
from productos, detallecompra, compras
where fecha_compra between '01/12/2014' and '31/12/2014'
group by productos.cod_prod, descripcion


Si no entiendo mal, los productos "vendidos" deberían ser aquellos que tienen factura.
Por lo tanto deberías buscar:

Facturas en el mes concreto y a partir de ahí (JOIN) acceder a los productos (ya que la factura tiene un cód. de producto). Si haces la JOIN de esas 2 tablas ya tienes: CODIGO, DESCRIPCION y CANTIDAD DEL PRODUCTO y la FECHA (para el where).

Prueba a hacer esta (con JOIN) a ver qué sale...

NOTA: Para añadir tablas diferentes a una SQL normalmente hay que usar JOIN. Por eso te está fallando la que pones.

Si en lugar de facturas, usas compras, es similar. En COMPRAS tienes la FECHA, en DETALLE_COMPRAS el CODIGO y la CANTIDAD y en PRODUCTOS la DESCRIPCIÓN.
Pero esas tres tablas deberán estar en la SQL unidas mediante JOIN.

Neftali [Germán.Estévez]
05-11-2014, 18:20:39
Un ejemplo práctico de lo que digo:

Valores de la tabla de compras:

Select *
from COMPRAS


Si quiero 2 campos de compras (fecha y dni) puedo hacer esto:


Select compras.fecha_compra, compras.dni
from compras


Si a eso quiero añadir el nombre del cliente; Como está en otra tabla distinta deberé añadir la tabla de clientes a la SQL.
Y además decirle al sistema cómo se relacionan ambas tablas.
Para ralacionaer ambas tablas debo hacer una JOIN y en el ON indicar los campos que se relacionan:


Select compras.fecha_compra, compras.dni, clientes.nombre
from compras
JOIN Clientes on compras.dni=clientes.dni


Fíjate en la tercera línea; Es algo así como decir que la tabla de clientes la añado a la consulta y la relaciono con la tabla de compras de la forma:
"compras.dni=clientes.dni"


De esta forma ya sabes cómo se relaxcionan tablas y puedes añadir campos de diferentes tablas a la consulta, pero siempre deberás añadirlas y relacionarlas de forma coherente.

Otro ejemplo; En las facturas tengo los datos de cada factura, pero no tengo el NOMBRE DEL PROVEEDOR. Si quiero obtener el nombre del proveedor deberé relacionar ambas tablas (si se puede); en este caso sí, utilizando el COD_PROV.


Select facturas.*, proveedores.nombre
from Facturas
join proveedores on facturas.cod_prov=proveedores.Cod_prov

eennzzoo
05-11-2014, 18:31:20
Empecemos con la primera, tal y como te he explicado más arriba.
Intenta hacerla utilizando JOIN's.
Nos centramos en una y lo comentamos, cuando lo entiendas las demás deberán salir de forma similar.

eennzzoo
06-11-2014, 18:50:26
Al primero no le encuentro la vuelta
--Código, descripción y cantidad de productos vendidos durante un mes dado

Tengo la tabla productos la cual tiene el cod_prod y la descripcion
Tengo la tabla detallecompra la cual tiene el num_factura_compra, el cod_prod y la cantidad
Y la tabla compras la cual tiene el num_factura_compra y la fecha_compraProbe con esta consulta y me devuelve filas iguales

select productos.cod_prod, descripcion, detallecompra.cantidad
from productos, detallecompra, compras
where fecha_compra between '01/12/2014' and '31/12/2014'
group by productos.cod_prod, descripcion, detallecompra.cantidad

ecfisa
06-11-2014, 19:38:51
Hola eennzzoo.

Es que esa selección está inconexa, no existe relación alguna entre columnas y que filtre las tablas en juego.

No miré a fondo los campos que establecen las relaciones entre tus tablas, pero en líneas generales la consulta debería ser algo parecido a esto:

SELECT P.COD_PROD, P.DESCRIPCION, D.CANTIDAD
FROM PRODUCTOS P
INNER JOIN DETALLECOMPRA D ON P.COD_PROD = D.COD_PROD
INNER JOIN COMPRAS C ON D.NUM_FACTURA = C.NUM_FACTURA_COMPRA
WHERE C.FECHA_COMPRA BETWEEN '01/12/2014' AND '31/12/2014'
GROUP BY P.COD_PROD, P.DESCRIPCION, D.CANTIDAD


Saludos :)

Neftali [Germán.Estévez]
06-11-2014, 20:36:34
Pido disculpas, porque intentando añadir una respuesta y modificar una existente he "cambiado" el contenido de uno de tus mensajes [eennzzoo] (http://www.clubdelphi.com/foros/member.php?u=83505), en concreto este (http://www.clubdelphi.com/foros/showpost.php?p=484279&postcount=12). Me hice un lío. :o

Tal y como te explica ecfisa, a este consulta tuya, le falta conectar las tablas (usando JOIN y ON)

select productos.cod_prod, descripcion, detallecompra.cantidad
from productos, detallecompra, compras
where fecha_compra between '01/12/2014' and '31/12/2014'
group by productos.cod_prod, descripcion, detallecompra.cantidad

De forma que el resultado debe quedar algo como lo que te ha puesto él:


SELECT P.COD_PROD, P.DESCRIPCION, D.CANTIDAD
FROM PRODUCTOS P
INNER JOIN DETALLECOMPRA D ON P.COD_PROD = D.COD_PROD
INNER JOIN COMPRAS C ON D.NUM_FACTURA = C.NUM_FACTURA_COMPRA
WHERE C.FECHA_COMPRA BETWEEN '01/12/2014' AND '31/12/2014'
GROUP BY P.COD_PROD, P.DESCRIPCION, D.CANTIDAD



Ahora que las tienes las dos, fíjate en la diferencia, intenta entenderlo y corregirlo en las siguientes.
él ha utilizado un "Alias" para cada tabla (la letra que hay detrás del nombre) y las ha unido con JOIN..ON

eennzzoo
07-11-2014, 16:10:38
Pido disculpas, porque intentando añadir una respuesta y modificar una existente he "cambiado" el contenido de uno de tus mensajes [eennzzoo] (http://www.clubdelphi.com/foros/member.php?u=83505), en concreto este (http://www.clubdelphi.com/foros/showpost.php?p=484279&postcount=12). Me hice un lío. :o

Tal y como te explica ecfisa, a este consulta tuya, le falta conectar las tablas (usando JOIN y ON)



De forma que el resultado debe quedar algo como lo que te ha puesto él:



Ahora que las tienes las dos, fíjate en la diferencia, intenta entenderlo y corregirlo en las siguientes.
él ha utilizado un "Alias" para cada tabla (la letra que hay detrás del nombre) y las ha unido con JOIN..ON
Probe de esa forma pero me devuelve esto
http://k33.kn3.net/3/6/7/3/E/F/4D2.png
Y en detallecompra tengo eso. Me tendria que mostrar
COD_PROD DESCRIPCION CANTIDAD
1 Aguas minerales 3
2 Gaseosas 1

Gracias por la ayuda.

Neftali [Germán.Estévez]
07-11-2014, 17:20:40
A mi, esta:

SELECT P.COD_PROD, P.DESCRIPCION, D.CANTIDAD
FROM PRODUCTOS P
INNER JOIN DETALLECOMPRA D ON P.COD_PROD = D.COD_PROD
INNER JOIN COMPRAS C ON D.NUM_FACTURA_COMPRA = C.NUM_FACTURA_COMPRA
WHERE C.FECHA_COMPRA BETWEEN '12/01/2014' AND '12/31/2014'
GROUP BY P.COD_PROD, P.DESCRIPCION, D.CANTIDAD


Me da esto:

http://s26.postimg.org/m2nbpehl5/Captura_326.png

eennzzoo
07-11-2014, 17:26:36
A mi, esta:

SELECT P.COD_PROD, P.DESCRIPCION, D.CANTIDAD
FROM PRODUCTOS P
INNER JOIN DETALLECOMPRA D ON P.COD_PROD = D.COD_PROD
INNER JOIN COMPRAS C ON D.NUM_FACTURA_COMPRA = C.NUM_FACTURA_COMPRA
WHERE C.FECHA_COMPRA BETWEEN '12/01/2014' AND '12/31/2014'
GROUP BY P.COD_PROD, P.DESCRIPCION, D.CANTIDAD


Me da esto:

http://s26.postimg.org/m2nbpehl5/Captura_326.png

Pero si hay 4 productos en total 3 aguas y 1 gaseosa.

eennzzoo
08-11-2014, 16:35:41
Pero si hay 4 productos en total 3 aguas y 1 gaseosa.
Ya lo solucione, pero no logro solucionar este:

select *
from proveedores
inner join pedidos
on proveedores.cod_prov = pedidos.cod_prov
inner join productos
on pedidos.cod_prod = productos.cod_prod
where productos.descripcion = 'Gaseosas' and productos.descripcion = 'Aguas minerales'


Probe con esa consulta pero no devuelve nada.
En pedidos y productos tengo esto:
http://s4.postimg.org/w740gsa71/SQL.png
Me tendria que mostrar los datos del proveedor 2 ya que suministra los 2 productos.Gracias.

ecfisa
08-11-2014, 17:15:54
Hola eennzzoo.
Ya lo solucione, pero no logro solucionar este:

...
where productos.descripcion = 'Gaseosas' and productos.descripcion = 'Aguas minerales'

Probe con esa consulta pero no devuelve nada.
...
Pero analicemos... ¿ Existe al menos un producto cuya columna descripcion tenga los valores 'Gaseosas' y 'Aguas minerales' a la vez ?

No sé la finalidad de la consulta, pero tal vez deberias usar OR como operador lógico.

Saludos :)

eennzzoo
08-11-2014, 17:24:39
Hola eennzzoo.

Pero analicemos... ¿ Existe al menos un producto cuya columna descripcion tenga los valores 'Gaseosas' y 'Aguas minerales' a la vez ?

No sé la finalidad de la consulta, pero tal vez deberias usar OR como operador lógico.

Saludos :)
Claro pense en eso, pero en descripcion viene gaseosas o aguas minerales, pero no los dos juntos. Porque lo que pide la consulta es el proveedor/es que suministran gaseosas y aguas minerales. Seria el caso del proveedor 2. Y colocando or devuelve el proveedor 1 y dos veces el proveedor 2.

ecfisa
08-11-2014, 23:36:48
Hola eennzzoo.
Claro pense en eso, pero en descripcion viene gaseosas o aguas minerales, pero no los dos juntos. Porque lo que pide la consulta es el proveedor/es que suministran gaseosas y aguas minerales. Seria el caso del proveedor 2. Y colocando or devuelve el proveedor 1 y dos veces el proveedor 2.
A ver si es así la consulta que buscas...

SELECT P1.NOMBRE AS NOMBRE, P1.COD_PROV AS CODIGO /*(1) , ...*/
FROM PROVEEDORES P1
INNER JOIN PEDIDOS P2 ON P1.COD_PROV = P2.COD_PROV
INNER JOIN PRODUCTOS P3 ON P2.COD_PROD = P3.COD_PROD
WHERE P3.DESCRIPCION = 'Gaseosas' OR P3.DESCRIPCION = 'Aguas minerales'
GROUP BY P1.NOMBRE, P1.COD_PROV /*(1) , ...*/

(1) Demás columnas que desees seleccionar.

Saludos :)

eennzzoo
09-11-2014, 00:09:06
Hola eennzzoo.

A ver si es así la consulta que buscas...
Código SQL [-] (http://www.clubdelphi.com/foros/#)SELECT P1.NOMBRE AS NOMBRE, P1.COD_PROV AS CODIGO /*(1) , ...*/ FROM PROVEEDORES P1 INNER JOIN PEDIDOS P2 ON P1.COD_PROV = P2.COD_PROV INNER JOIN PRODUCTOS P3 ON P2.COD_PROD = P3.COD_PROD WHERE P3.DESCRIPCION = 'Gaseosas' OR P3.DESCRIPCION = 'Aguas minerales' GROUP BY P1.NOMBRE, P1.COD_PROV /*(1) , ...*/

(1) Demás columnas que desees seleccionar.

Saludos :)
Si ese funciona, pero porque es or?