Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Unir 2 tablas en una consulta pero con condicion (https://www.clubdelphi.com/foros/showthread.php?t=74420)

oscarac 17-06-2011 22:22:50

Unir 2 tablas en una consulta pero con condicion
 
buenas tardes
ahi va mi problema

tengo 2 tablas
1 de movimientos que llamaremos MOVI
Periodo, Cuenta, DH, MND, Importe
1 de Saldos que llamaremos Saldo
Año, Cuenta, Debe01, Haber01, Debe02, Haber02.... Debe12, Haber12

la consulta que necesito es mas o menos la siguiente

ubicar las cuentas contables que han tenido movimiento en un periodo x, pero a la ves Unirlas con las cuentas que tengan al menos un saldo en los meses anteriores al periodo (tiene saldo si Debe01 - Haber01 + Debe02 - Haber02 + Debe03 - Haber03.... Deben - Habern) es Diferente de 0, donde n es el mes contable menos 1

entonces... he estado haciendo muchas pruebas y no logro el resultado pedido puesto que me jalan todas las cuentas (del movimiento que es correcto), pero tambien todas las del saldo, no tengo ideas para hacer una funcion que me tome la suma de la tabla de saldos y muestre los que son diferentes de cero

Estoy trabajando con Access (Si lo se..... Access), pero tambien con MS SQL SERVER

Alguna idea? que puedas funcionarme al menos en SQL Server?


gracias

Caral 18-06-2011 02:57:53

Hola
No entiendo.
Saludos

oscarac 21-06-2011 22:23:51

no?
a ver te explico

tengo 2 tablas 1 donde estan los movimientos de una cuenta contable y en otra estan los saldos de la misma cuenta, solo que la tabla de saldos tiene 24 campos vale decir

Cita:

Cuenta, Debe01, Haber01, Debe02, Haber02... Debe1, Haber12
eso quiere decir que guarda los saldos de las cuentas de los meses anteriores al mes actual

entonces el query que quiero debe hacer mas o menos esto

1.- identificar las cuentas que tienen movimientos dentro del mes solicitado
2.- identificar las cuentas que en la tabla de saldos el resultado de sumar y restar Debe01+Debe02+Debe03....Debenn(donde nn=mes -1) - Haber01+Haber02+Haber03...habernn(donde nn=mes -1)

Se entiende ahora?

he estado revisando y creo que debo usar Having, armando una cadena sql donde me vaya sumando los campos hasta el mes en cuestion

maeyanes 21-06-2011 22:36:52

Hola...

Si pones un ejemplo más gráfico del resultado que quieres, se te podría entender mejor. ¿Puedes poner el resultado que esperas obtener, usando valores?


Saludos...

oscarac 21-06-2011 22:53:40

ok con datos
el problema basicamente es sacar los datos de la tabla de saldos porque con los movimientos no hay problema

Ejemplo
datos de la tabla de saldos, solo mostrarte los 4 primeros meses imaginando que estoy en el mes 5

Cita:

Cuenta...Debe01...Haber01...Debe02...Haber02...Debe03...Haber04....
104001....100.00.........0.00.....25.00.......0.00.........0.00.....50.00
104002.......0.00.........0.00.......0.00.......0.00.........0.00.......0.00
104003.......1.00.........0.00.....100.00......0.00.........0.00....200.00
104004......25.00.........0.00........0.00.....0.00..........0.00.....25.00

entonces deberia mostrarme las cuentas
104001 saldo....75.00
104003 saldo.....-99.00

la 104002 y la 104004 no porque la sumatoria del debe-haber da como resultado cero (o)

ahora si me deje entender?

Caral 21-06-2011 23:22:47

Hola
Me da la impresion de que el concepto de las tablas no es el idoneo.
Para mi seria mejor asi:
Año, Cuenta, Debe, Haber, PERIODO
Con tus datos quedaria asi:

Cuenta..... Debe....... Haber......PERIODO

104001.....100.00.......0.00........ 01
104002.......0.00.......0.00........ 01
104003.......1.00.......0.00........ 01
104004......25.00.......0.00........ 01

104001......25.00.......0.00........ 02
104002.......0.00.......0.00........ 02
104003.....100.00.......0.00........ 02
104004.......0.00.......0.00........ 02

104001.......0.00......50.00........ 03
104002.......0.00.......0.00........ 03
104003.......0.00.....200.00........ 03
104004.......0.00......25.00........ 03

Sacar datos de aqui seria muy sencillo, por año, periodo, cuenta, debe, haber, sumatorias, etc...
Saludos

Chris 21-06-2011 23:35:07

Cita:

Empezado por oscarac (Mensaje 404426)
entonces deberia mostrarme las cuentas
104001 saldo....75.00
104003 saldo.....-99.00

la 104002 y la 104004 no porque la sumatoria del debe-haber da como resultado cero (o)

ahora si me deje entender?

Puedes crear un campo calculado dentro de la propia consulta (no sé si Access permite esto). Luego filtra con WHERE utilizando ese nuevo campo. Por ejemplo:

Código SQL [-]
/* utilizo la constante "-1" porque supongo que debe01 y debe02 almacenan siempre cantidades positivas */
Select *, ((debe01 + debe02) * -1) + (haber01 + haber01) as saldo_total from ...
where saldo_total <> 0;

Sinceramente tampoco logro entender lo que deseas. Te aconsejo que utilices la técnica "divide y vencerás" si es que no logras comprender la tarea en su totalidad.

Saludos,
Chris

oscarac 21-06-2011 23:36:06

Cita:

Empezado por Caral (Mensaje 404431)
Hola
Me da la impresion de que el concepto de las tablas no es el idoneo.
Para mi seria mejor asi:
Año, Cuenta, Debe, Haber, PERIODO
Con tus datos quedaria asi:

Cuenta..... Debe....... Haber......PERIODO

104001.....100.00.......0.00........ 01
104002.......0.00.......0.00........ 01
104003.......1.00.......0.00........ 01
104004......25.00.......0.00........ 01

104001......25.00.......0.00........ 02
104002.......0.00.......0.00........ 02
104003.....100.00.......0.00........ 02
104004.......0.00.......0.00........ 02

104001.......0.00......50.00........ 03
104002.......0.00.......0.00........ 03
104003.......0.00.....200.00........ 03
104004.......0.00......25.00........ 03

Sacar datos de aqui seria muy sencillo, por año, periodo, cuenta, debe, haber, sumatorias, etc...
Saludos

leyendo esto me hago una pregunta....

si el diseño de la tabla de saldos fuese como el que caral propone, entonces tendria 12 registros por cada cuenta y por cada año versus 1 registro por cuenta como lo tengo ahora

alguien podria hacer una comparacion (en espacio) sobre cual opcion es mejor?

oscarac 21-06-2011 23:41:24

mas o menos lo he solucionado asi...
Código SQL [-]
 
Select Left(M.CUENTA,2) As CNivel, M.CUENTA, M.Libro, M.Voucher, M.RGt, M.Documento, M.FechaDocumento, M.Anexo, M.CCosto, 
M.Mnd, M.Glosa, P.Descripcion, 
iif (M.DH = 'D', M.n_IMP , 0.00) AS DEBE,  
iif (M.DH = 'H', M.n_IMP , 0.00) AS HABER 
from (tblmovimientocontable M
Left Join tblPlanContable P On (P.Empresa = '001' and P.Periodo = '2009' and M.Cuenta = P.Cuenta))
where M.Empresa = '001' and M.Periodo = '200902' order by M.CUENTA, M.FechaDocumento 
Union all
Select Left(S.CUENTA,2) As CNivel, S.CUENTA, '' as libro, '' as voucher, '' as rgt, '' as documento, 
'' as fechadocumento, '' as anexo, '' as ccosto, '' as mnd, 
'' as glosa, '' as descripcion, 0 as debe, 0 as haber 
from tblcuentasaldo S 
where (S.nd_ant00 + S.nd_ant01) - (S.nh_ant00 - S.nh_ant01) <> 0 and nv = '6' 
and S.Cuenta not in (Select Cuenta from tblmovimientocontable where Periodo = '200902') 
order by S.Cuenta

aunque creo que mejor usare having

Caral 22-06-2011 02:16:21

Hola
Peso, Bites.
Si colocas una tabla con los datos en una linea y otra con los datos como digo y ves cuanto pesa (mg) tendra que ser lo mismo ya que son Bites o Bytes o lo que sea.:D
es lo mismo:
1,1
Que
1
1
La diferencia que veo es el orden de la tabla, el diseño sera mejor, en mi opinion.
Ademas no se tendra que hacer mucho (sql) para obtener los datos.
No se, digo...
Saludos


La franja horaria es GMT +2. Ahora son las 07:08:17.

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