Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Query con 3 tablas (https://www.clubdelphi.com/foros/showthread.php?t=46336)

Vichomo 29-07-2007 05:36:22

Query con 3 tablas
 
Buenas Noches Amigos del Club... :D

Tengo un serio problema, estoy haciendo un sistemita que es para llevar remisiones (facturas), productos, clientes, etc, el problema esta en que estoy haciendo una pantalla donde tengo un dbgrid, ese dbgrid tiene que mostrarme ciertos campos.
les explicare brevemente el proceso, cuando remisiono un producto o mas
guardo la clave de cliente q remisiona, guardo la clave de producto, y la cantidad de producto, esto se guarda en detalle remision, ahora lo que quiero hacer es jalar en la pantalla, el nombre de cliente, su saldo, y la cantidad acumulada que ha sumado el cliente de todas sus remisiones, solo me tiene que mostrar la cantidad de ciertos productos (especificamente del 1 y 2)
Les dire que tablas son con las que interactuo en esa pantalla. solo pondre los campos que necesitamos.

Son 3
1. tabla --> Clientes (cvecli, razso(es el nombre), saldo)
2. tabla ---> Remisiones (cverem, cvecli)
3. tabla ---> Detalle_remision(cverem, cvepro(clave del producto), cantidad)

Eh tratado de hacer querys pero no me sale, no eh podido, ya llevo un par de dias trabado en esto. lo estoy haciendo el delphi 6, ocupo un dbgrid que se conecta con su datasource y este a su dataset.

Este query eh hecho, bueno de mucho y no me corre, me dice invalid column reference, solo si le quito los campos de de c.cvecli, c.razso, c.saldo, me corre pero solo me da la suma de la cantidad por cada remision.

select cverem, sum(canti), c.cvecli, c.razso, c.saldo from remisiones r, detalle_remision d, clientes c where r.cverem = d.cverem and r.cvecli= c.cvecli group by cverem

De antemano les agradezco su tiempo y sus comentarios. ;)

Caral 29-07-2007 15:24:01

Hola
Bienvenido al club.
Tal vez asi:
Código SQL [-]
SELECT Clientes.cvecli, Clientes.razso, Clientes.saldo, Remisiones.cverem, 
Remisiones.cvecli, Detalle_remision.cverem, Detalle_remision.cvepro, 
SUM(Detalle_remision.cantidad) as (Cantidad) FROM Clientes, Remisiones,
Detalle_remision, WHERE Remisiones.cverem = Detalle_remision.cverem and 
Clientes.cvecli = Remisiones.cvecli GROUP BY cvecli
Saludos

Vichomo 29-07-2007 19:18:16

No funciono..
 
:( Hola Caral, gracias por tu tiempo y tu respuesta pero tenemos malas noticias, no funciona, me sigue saliendo el mismo error cuando ejecuto el query en Ibexpert Invalid Column reference.

Pero de todas maneras te agradezco..

Buen Dia...

roman 29-07-2007 19:33:05

Hola,

Bien a bien no sé en qué radica el problema, pero en tu consulta original

Código SQL [-]
select cverem, sum(canti), c.cvecli, c.razso, c.saldo
from remisiones r, detalle_remision d, clientes c
where r.cverem = d.cverem and r.cvecli= c.cvecli
group by cverem

la referencia al campo cvrem en group by es ambigua; puede ser la llave de la tabla remisiones o la llave foranea en la tabla detalle_remision.

Quizá por ahí vaya el problema.

// Saludos

Vichomo 29-07-2007 19:54:11

Query
 
Si es ambigua por lo que vi, pero entonces como podria agruparlos, para que mi resultado fuera el requerido, porque si es por cvecli, tambien es ambigua.

Gracias

roman 29-07-2007 19:59:12

¿Has probado con d.cvrem? Y, por cierto, en el select pasa lo mismo.

// Saludos

Vichomo 29-07-2007 20:06:08

Cita:

Empezado por roman
¿Has probado con d.cvrem? Y, por cierto, en el select pasa lo mismo.

// Saludos

Si ya lo pobre asi, a los dos les puse r.cverem o d.cverem y me dice lo mismo, invalid column reference. no sera por la suma?

roman 29-07-2007 20:08:30

Pudiera ser. Tienes sum(canti), pero en la descripción que das de tus tablas, el campo se llama cantidad.

// Saludos

Caral 29-07-2007 20:38:38

Hola
Para seguir con esto, me parece:
Código SQL [-]
SELECT DISTINCTROW Clientes.cvecli, Clientes.razso, Clientes.saldo,
Remisiones.cverem, Remisiones.cvecli, Detalle_remision.cverem,
Detalle_remision.cvepro, SUM(Detalle_remision.cantidad) AS [Cantidad]
FROM (Clientes INNER JOIN Remisiones ON Clientes.cvecli = Remisiones.cvecli) 
INNER JOIN Detalle_remision ON Remisiones.cverem = Detalle_remision.cverem
GROUP BY Clientes.cvecli, Clientes.razso, Clientes.saldo, Remisiones.cverem, 
Remisiones.cvecli, Detalle_remision.cverem, Detalle_remision.cvepro
Ya que hay una suma de por medio tiene que haber un distinc de lo contrario no daria el total de la suma, el group by, tiene que acoplar el orden de la solicitud, ya que hay campos con nombres iguales.
Saludos

Vichomo 29-07-2007 20:43:49

Cita:

Empezado por roman
Pudiera ser. Tienes sum(canti), pero en la descripción que das de tus tablas, el campo se llama cantidad.

// Saludos

Error: es canti no cantidad. pero el query sigue saliendo error

Vichomo 29-07-2007 21:26:34

Cita:

Empezado por Caral
Hola
Para seguir con esto, me parece:

Código SQL [-]
SELECT DISTINCTROW Clientes.cvecli, Clientes.razso, Clientes.saldo,
Remisiones.cverem, Remisiones.cvecli, Detalle_remision.cverem,
Detalle_remision.cvepro, SUM(Detalle_remision.cantidad) AS [Cantidad]
FROM (Clientes INNER JOIN Remisiones ON Clientes.cvecli = Remisiones.cvecli)
INNER JOIN Detalle_remision ON Remisiones.cverem = Detalle_remision.cverem
GROUP BY Clientes.cvecli, Clientes.razso, Clientes.saldo, Remisiones.cverem,
Remisiones.cvecli, Detalle_remision.cverem, Detalle_remision.cvepro




Ya que hay una suma de por medio tiene que haber un distinc de lo contrario no daria el total de la suma, el group by, tiene que acoplar el orden de la solicitud, ya que hay campos con nombres iguales.
Saludos

Hola nuevamente Caral, tu Query me funciono pero falto, lo que pasa que utilizo SQL en el manejador IBExpert, me funciono al quitarle DISTINCTROW, porque no acepta esa palabra reservada, pero el resultado me lo duplicado sin hacer la suma por cliente, osea me salen todos sus productos con su respectiva cantidad pero sin sumarla, para eso era el DISTINCTROW, yo lo trate de hacer, pero luego leyendo me di cuenta que no sirve para SQL, solo sirve DISTINC, entonces que me podrias proponer para que no me duplicara y me sumara?

Gracias otra vez.

Caral 29-07-2007 21:29:52

Hola
Usa DISTINC, es casi lo mismo, con esto lo que hace es buscar los que coincidan sin duplicarlos, pruebalo.
El problema de la suma si persiste tal vez se solucione con un having.
Saludos

Vichomo 29-07-2007 21:37:20

Cita:

Empezado por Caral
Hola
Usa DISTINC, es casi lo mismo, con esto lo que hace es buscar los que coincidan sin duplicarlos, pruebalo.
El problema de la suma si persiste tal vez se solucione con un having.
Saludos

Ya lo puse asi y el resultado es asi:
Este cliente tiene 2 remisiones y en cada remision tiene 2 productos, el resultado que yo necesito seria una fila, con su nombre y la suma de la cantidad de todos sus productos, eso ya lo sabes, el resultado del query al ponerle distinct me arroja 4 veces su nombre, y cada nombre con su respectiva cantidad del producto, osea no me los esta sumando, espero me haya dado a entender.
Gracias

Caral 29-07-2007 21:45:24

Hola
No se en sql, pero intenta last.
Saludos

TheFlame 30-07-2007 17:59:42

Hola.
Soy nuevo en el foro y al ver tu problema no pude evitar ayudarte con la consulta SQL.
Por lo que pude entender del problema es que necesitas la suma total de la cantidad de productos que compro el cliente, para ello la consulta SQL seria como sigue:
Código SQL [-]
Select Clientes.cvecli, Clientes.razso, Sum(Detalle_remision.cantidad) as CantidadTotal, Clientes.Saldo
From Clientes Inner Join Remisiones On Clientes.cvecli=Remisiones.cvecli
Inner join Detalle_remision on Remisiones.cverem=Detalle_remision.cveremv
Group By Clientes.cvecli, Clientes.razso, Clientes.Saldo

Espero que mi aporte haya servido de ayuda, Saludos.;)

Vichomo 31-07-2007 07:34:32

Solucionado
 
Cita:

Empezado por TheFlame
Hola.
Soy nuevo en el foro y al ver tu problema no pude evitar ayudarte con la consulta SQL.
Por lo que pude entender del problema es que necesitas la suma total de la cantidad de productos que compro el cliente, para ello la consulta SQL seria como sigue:
Código SQL [-]Select Clientes.cvecli, Clientes.razso, Sum(Detalle_remision.cantidad) as CantidadTotal, Clientes.Saldo From Clientes Inner Join Remisiones On Clientes.cvecli=Remisiones.cvecli Inner join Detalle_remision on Remisiones.cverem=Detalle_remision.cveremv Group By Clientes.cvecli, Clientes.razso, Clientes.Saldo


Espero que mi aporte haya servido de ayuda, Saludos.;)

Gracias TheFlame :D... Tu query me ha servido de maravilla, ya quedo solucionado. muchas gracias a todos tambien por su tiempo y su ayuda! Nos vemos en el proximo Query ;)

Vichomo 31-07-2007 07:47:43

otro mas...
 
:rolleyes:
Oye amigo the flame necesito tu ayuda, es para el mismo query, yo quiero q solo sume la cantidad de los productos 1 y 2, la tabla se llama productos y su clave es cvepro y se relaciona con detalle_remision q tambien tiene el mismo nombre de campo q es cvepro, espero puedas ayudarme.

y para el q pueda ayudarme son bien recibidos sus comentarios. gracias.:eek:

Vichomo 31-07-2007 07:54:11

JOJOJO, ya pudee.. gracias de todas maneras, aqui esta el query que me funciono, solo le agrege 2 filitas mas.

Select Clientes.cvecli, Clientes.razso, Sum(Detalle_remision.canti) as Emulsion, Clientes.Saldo
From Clientes Inner Join Remisiones On Clientes.cvecli=Remisiones.cvecli
Inner join Detalle_remision on Remisiones.cverem=Detalle_remision.cverem
inner join productos on detalle_remision.cvepro=productos.cvepro
where detalle_remision.cvepro=1 or detalle_remision.cvepro=2
Group By Clientes.cvecli, Clientes.razso, Clientes.Saldo

Vichomo 31-07-2007 08:34:59

Aun mas del mismo query
 
Hola, oigan saben como hacer que me traiga todos los clientes, osea quiero todos los registros aunque el valor sea nulo, en especifico del mismo query que puse arriba que ustedes me ayudaron a hacerlo, el resultado es la suma de tods los clientes que han remisionado, pero solo me aparecen los que han comprado del producto 1 y 2, pero quiero que me aparezcan todos los clientes que hay en la tabla, aunque la suma sea Null, eh probado el LEFT JOIN, quite el INNER JOIN y lo probe pero no me resulto, me servirian muchos sus comentarios, muchas gracias!! :D

TheFlame 31-07-2007 16:01:38

Podria ser asi.
 
Cita:

Empezado por Vichomo

Código SQL [-]Select Clientes.cvecli, Clientes.razso, Sum(Detalle_remision.canti) as Emulsion, Clientes.Saldo
From Clientes Inner Join Remisiones On Clientes.cvecli=Remisiones.cvecli
Inner join Detalle_remision on Remisiones.cverem=Detalle_remision.cverem
inner join productos on detalle_remision.cvepro=productos.cvepro
where detalle_remision.cvepro=1 or detalle_remision.cvepro=2
Group By Clientes.cvecli, Clientes.razso, Clientes.Saldo



Hola, me alegra que mi aporte te sirviera.
Para que obtengas todos los registros de tu tabla Clientes tendrías que hacer los Joins con Right o Left, a mí parecer debería funcionar con Right, la consulta llegaría a ser de la siguiente forma:


Código SQL [-]Select Clientes.cvecli, Clientes.razso, Sum(Detalle_remision.canti) as Emulsion, Clientes.Saldo

Código SQL [-]
From Clientes Right Join Remisiones On Clientes.cvecli=Remisiones.cvecli
Inner join Detalle_remision on Remisiones.cverem=Detalle_remision.cverem
inner join productos on detalle_remision.cvepro=productos.cvepro
where detalle_remision.cvepro=1 or detalle_remision.cvepro=2
Group By Clientes.cvecli, Clientes.razso, Clientes.Saldo




Nota: Solo el cambio fue en el primer Join, porque queremos mostrar todos los resultados de la tabla Clientes si es que no funciona con Right cámbialo por Left

Saludos.:rolleyes:


La franja horaria es GMT +2. Ahora son las 04:48:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi