![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
|||||
|
|||||
|
Hola Amigo,
disculpa la tardanza y disculpa que no fui explicitamente claro con el INNER JOIN, inlcluso no te dije toda la historia, la cual es necesario que la domines de lo contrario no podras hacer querys eficientes. Por favor lee detalladamente las explicacion a continuacion del JOIN y al final del post te escribo el querry que ocupas. Primero debes saber que hay dos sabores de JOIN: INNER JOIN LEFT OUTER JOIN si tenemos tabla_A: Id, englishword -------------- 1 bird 2 house 3 dog 5 cat 6 black si tenemos tabla_B: Id, spanishword -------------- 1 pajaro 2 casa 3 perro 5 gato si hacemos el siguiente select:
el resultado seria: Cita:
Ahora, si queremos sacar TODOS los registros de la tabla_A con su respectivo dato de la tabla_B pero tambien incluyendo los que no pudieran tener equivalencia en tabla_B entonces harias:
el resultado seria: Cita:
Hasta aqui ya te estaras imaginando que lo que necesitas es usar LEFT OUTER JOIN, porque basicamente tu quieres repasar todos los registros de la tabla presupuesto la par con resumenes si (si los hubiera) de la tabla compras. Sin envargo en estos ejemplo la relacion es de 1 a 1, o almenos de muchos a 1 es decir, por un registro en la tabla A se espera un tan solo registro en la tabla B, pero el asunto se vuleve diferente cuando la relacion es uno a muchos, por ejemplo: si la tabla B tuviera: Id, spanishword -------------- 1 pajaro 1 ave 1 plumifero 2 casa 3 perro 5 gato como vez, el id=1 esta 3 veces si se aplica el utimo querry el resultado seria: Cita:
Por consiguinete, si tu haces el siguinete querry:
Los sum() y los count() de la tabla COMPRAS saldran bien, pero los de la tabla presupuesto saldran mal ya que ahora hay datos duplicados por cada ocurrencia encontrada en compras, de la misma manera como se duplica el dato "Bird" en el ejemplo que te puse tambien aqui el dato p.monto saldra duplicado. Entonces como se resuleve este tipo de problemas? bueno se resuelve resumiendo la tabla compras UNA TAN SOLA VEZ y enlazando el resultado a la tabla presupuesto usando LEFT OUTER JOIN, Es decir envez de escribir el nombre de la tabla despues del left outer join se puede perfectamente escribir un SELECT que resume ya la tabla antes de hacer el enlazado, ejemplo: Cita:
Ya terminamos?, no todavia, , c.Tot_compr y c.C_mon_compr ya tienen el total de la compra y la cuenta de la compra lista para enlazarla con una tabla mestra, pero tu todavia necesitas resumir la tabla presupuesto para sumar y contar el valor monto.La manera de sumarizar la tabla presupuesto e incluir los totales de la tabla compra sin duplicar se puede hacer usando el comando DISTINCT. creo que este es el querry final: Cita:
Espero que te funcione o por lo menos te haya dado la suficiente informacion para adaptar tus querrys. Última edición por Bpascal fecha: 19-01-2009 a las 22:49:00. |
|
#2
|
||||
|
||||
|
Haz dado en el clavo BPascal, lo que el amigo necesitaba es una explicación así de clara de lo joins...mis respetos señor.
Estaba analizando el caso y no se si me equivoque pero al parecer nuestro amigo atacó el problema con lo que él ya sabía sin investigar un poquito más a ver que otras cosas se pueden hacer. A todos nos pasó en su momento y más de uno regresamos a nuestros propios códigos a "optimizarlos" .
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
|
#3
|
|||
|
|||
|
Muchas gracias por tu tan clara explicación, pero ocurre algo, al tratar de hacer la consulta en el IBExpert, me arroja un error en la primera linea, No reconoce el campo "C.T_monto_compr", que es el campo de la sumatoria de la tabla compras "sum(Monto_compr) as T_monto_compr".
Al parecer no reconoce este campo ya que es la respuesta de la segunda consulta. porque ocurrira esto? utilizo Firebird 2.0, sera que en esta version no se puede realizar este tipo de consultas? y lo ultimo, donde agrego la considion del campo estado de la tabla compras? ya que son 2 condiciones distintas, 'F' para la suma y 'P' para el count. Les dejo mis dudas, y de ante mano muchas gracias por todo, me han ayuda muchisimo. Saludos |
|
#4
|
||||
|
||||
|
Eh! Bpascal, estupendísima explicación. Además eres el único que has dado en el clavo.
Yo creo que hemos aprendido todos algo con tu aportación. Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
|
#5
|
|||
|
|||
|
Cita:
Cita:
|
|
#6
|
|||
|
|||
|
Bpascal, lo he verificado varias veces, y no es un problema de deletreo, incluso probe con otro ejemplo utilizando la misma idea y tampoco funciona.
Al parecer Firebird 2.0, no soporta este tipo de consultas. Podrá ser esto?? |
|
#7
|
||||
|
||||
|
Pero esto sí debe de 'tragar'
Date cuenta de que he quitado la función de agregado al campo monto y lo he añadido al group by. Ya nos contarás. Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
|
#8
|
|||
|
|||
|
Amigos, no me funciona para nada. La idea que mas me gusta fue la de Bpascal, pero tampoco resulto, revise que estuviera todo bien escrito, y asi es.
Será que utilizo Firebird 2.0, que no permite este tipo de consultas. Si es asi que me recomiendan hacer? Gracias |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Facturación e Inventario | silver07 | Conexión con bases de datos | 49 | 22-10-2015 19:45:33 |
| SQL inventario | mjjj | SQL | 7 | 12-12-2008 17:13:29 |
| Aplicacion + Inventario | mjjj | Varios | 8 | 03-11-2008 15:58:54 |
| Costo de Inventario | NickName | SQL | 4 | 09-10-2006 06:30:31 |
| Inventario de Hardware | vichovi | API de Windows | 3 | 03-01-2005 15:35:10 |
|