Bases de Datos - Select a dos tablas

 
Vista:
Imágen de perfil de JimGod

Select a dos tablas

Publicado por JimGod (3 intervenciones) el 24/09/2008 17:55:02
Tengo una duda y por ende el problema..

tengo dos tablas... con campos similares. y quiero una consulta q me arroje como resultado
la suma de cada columna por separado....

tabla chques
proveedor importe iva total
1 100 15 115
1 50 7.5 57.5
1 200 30 230
total 350 52.5 402.5

tabla efectivo
proveedor importe iva total
1 100 15 115
total 100 15 115

supongamos q tengo esas tablas y esos valores

al hacer mi consulta por inner join, cuando el proveedor sea = en las dos tablas, en las primeras tres columnas si me hace la suma correcta(de la de chques) pero en la de efectivo me sale como si tuviera 3 veces el mismo valor...porque?? ya le intente y no me sale, por eso recurri a este foro ojala me puedan ayudar...

los datos resultantes me salen asi

tabla chques
proveedor importe iva total
1 100 15 115
1 50 7.5 57.5
1 200 30 230
total 350 52.5 402.5

tabla efectivo
proveedor importe iva total
1 100 15 115
1 100 15 115
1 100 15 115
total 300 45 345

cuando solo en efectivo tengo un dato con 100.

ojala me puedan ayudar... esta es mi sentencia:

sel = "select chques.importe AS IMPORTE1,chques.iva AS IVA1,chques.total AS TOTAL1" +
",efectivo.importe AS IMPORTE2,efectivo.iva AS IVA2,efectivo.total AS TOTAL2" +
" from chques INNER JOIN efectivo ON chques.clav_pro = efectivo.clav_pro where chques.fecha_in>=#" + finicio + "# AND chques.fecha_in<=#" + ffin + "#"


intente tambien esta:

sel = "select SUM(chques.importe) AS IMPORTE1,SUM(chques.iva) AS IVA1,SUM(chques.total) AS TOTAL1"+
",SUM(efectivo.importe) AS IMPORTE2,SUM(efectivo.iva) AS IVA2,SUM(efectivo.total) AS TOTAL2"+
" from chques,efectivo where chques.clav_pro=(SELECT clav_pro from proveed where nombre='" + nombre + "')"+
"AND fecha_in>=#" + finicio + "# AND fecha_in<=#" + ffin + "#"

pero me arrojan el mismo resultado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Select a dos tablas

Publicado por Franklin Gamboa (188 intervenciones) el 24/09/2008 20:46:25
Eso que te ocurre es por que como una tabla tiene tres filas y la otra una entonces al hacer el inner join tu única filas se están combinando con cada fila de la otra tabla, por lo que aparece 3 veces.

He leido tres veces tu problema y aún no veo como quieres que se visualicen los campos, yo en lo personal utilizaría un Union para pegar las sumas de los datos de las tablas y le agregaría una constante varchar para saber luego de que tabla lo tomé; mas o menos de esta forma

select 'cheques', * from cheques
union
select 'efectivo', * from efectivo

Eso te devolverá un Result set que va a juntar las filas de la tabla cheques y la tabla efectivo, el campo varchar que agrego al principio es en caso que sea imperativo saber de que tabla salío la fila, puede desecharse si no se ocupa.

Si decides usar el Union recuerda que el orden de las comlumnas es importante; ya que para que te funcione el union o las columnas deben tener el mismo tipo de dato o un tipo de dato implícitamente convertible (igual puedes castear las columnas al tipo de dato requerido si es necesario); así como el hecho que ambos selects deben devolver la misma cantidad de columnas.

Espero haberte ayudado.

Saludos,

Franklin Gamboa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JimGod

RE:Select a dos tablas

Publicado por JimGod (3 intervenciones) el 24/09/2008 23:08:21
Gracias mi Estimado Franklin ... a lo mejor me estaba complicando la vida...

pero mira, queria mostrar mi resultado en un Datagridview en C#, y como dices, 3 filas en una tabla y 1 en otra... mostrar las 3 filas de una tabla, y la unica fila de la otra tabla, y dejando "en blanco" las q no tuvieran valores....algo asi como:

tabla1
columna1, columna2,columna3,columna4,columna5,columna6
a b c aa bb cc
b c d --- -- --
c d f --- ---- ----

total total total total total total
a+b+c b+c+d c+d+f aa bb cc

pero pues desconocia si se podia o no... pero la solucion q me compartes me parece bien, ya q si se puede por la forma q yo "pensaba" pues que mejor...

Gracias !!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Select a dos tablas

Publicado por Franklin Gamboa (188 intervenciones) el 25/09/2008 15:55:38
Que motor de base de datos estas usando?

Si es SQL Server o Sybase está facil. sino pues mejor usa el union :)

Si es SQL Server o Sybase, puedes hacer un procedimiento almacenado que cree una tabla temporal con las seis columnas y que, en principio llene las primeras 3 columnas con lo que haya en la tabla efectivo, luego actualizas las otras tres con lo que haya en la tabla de cheques. esto pondrá todos los datos en la misma tabla temporal, luego nada mas retornas un select * from #temp y ya lo tienes resuelto.

Si estas usando cualquier otra base de datos, o usas el union (la salida fácil) o creas una tabla física cuyo objetivo es guardar los datos de esa consulta e igual, creas un procedimiento que llene esa tabla y luego le haces un select * a esa tabla. Yo pondría la instrucción para limpiar la tabla al inicio del proceso, de esta forma me aseguro que la tabal esté limpia antes de insertar datos. Si no te queda mas remedio que hacerlo de esta forma, recuerda bloquear la tabla al inicio del proceso para evitar que usuarios concurrentes afecten los resultados de la consulta (por este motivo prefiero el union).

Espero que esto te sirva.

Saludos,

Franklin Gamboa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JimGod

RE:Select a dos tablas

Publicado por JimGod (3 intervenciones) el 25/09/2008 20:19:22
MUCHAS GRACIAS!!

EN VERDAD VALIOSA TU AYUDA!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar