Ir al contenido


Foto

consulta rara y loca


  • Por favor identifícate para responder
8 respuestas en este tema

#1 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 08 enero 2010 - 01:03

Saludos a todos

primero les cometo el antecedente

tengo 2 tablas
cuentas y saldos

en cuentas estan toooodos los deudores

en saldos por cada pago que meten por medio de un sistema loco ( no le entiendo )
se agrega un registro que mas adelante puede se autorizado o cancelado, pero no se borra ( para que mantener pagos que no sirven )

ahora tengo la intencion de detectar que cuentas son las que estan realmente liquidadas
pero no lo quiero hacer a mano por lo que pense en una consulta de mysql

la hice asi




sql
  1. mysql> SELECT
  2.     -> cuenta.folio,
  3.     -> cuenta.nombre,
  4.     -> cuenta.no_credito,
  5.     -> saldo.saldo AS inicial,
  6.     -> SUM(saldo.pago) AS pagos ,
  7.     ->
  8.     ->  saldo.saldo + (- SUM(saldo.pago) )
  9.     ->
  10.     ->
  11.     -> FROM
  12.     -> saldo
  13.     -> INNER JOIN cuenta ON cuenta.id_cuenta = saldo.id_cuenta
  14.     ->
  15.     -> WHERE
  16.     ->
  17.     ->
  18.     -> cuenta.folio ='T002701081'
  19.     ->
  20.     ->
  21.     -> GROUP BY saldo.id_cuenta
  22.     -> ;
  23. +------------+-------------------------+------------+---------+---------+------------------------------------+
  24. | folio      | nombre                  | no_credito | inicial | pagos  | saldo.saldo + (- SUM(saldo.pago) ) |
  25. +------------+-------------------------+------------+---------+---------+------------------------------------+
  26. | T002701081 | LOPEZ TERRAZAS FERNANDO |        930 | 4266.00 | 5759.10 |                  -1493.0999755859 |
  27. +------------+-------------------------+------------+---------+---------+------------------------------------+
  28. 1 ROW IN SET (2.18 sec)



pero me falta calcular
cuanto es lo que deberia de pagar para cotejarlo con lo que ha pagado y si es asi mandarlo a un archivo de texto

el calculo es mas o menos asi
si la deuda inicial
es mayor a 999.99 agregar 35 %
de lo contrario si es mayor a 99.99 agregar 300 pesos
de lo contrario agregar 250

pero puedo manejar ese nivel de IF con anidaciones  ??

como puedo hacer para que el calculo lo haga exclusivamente con el primer registro de saldo que se tenga en la base de datos  ??

Digo la idea inicial que se me ocurrio es

1.- crear una tabla nueva "A" ( chance temporal ) donde se copien todos los numeros de cuenta que tengan un registro con saldo igual a cero
2.- en base a esa tabla temporal hacer una consulta de el saldo con fecha menor a 2006 ( fecha del inicio de la gestion ) y en base a ese saldo hacer el calculo de cuanto deberia de pagar
3.- agregar esos dos  resultados a "A"
4.- en base a los numeros de cuenta de la tabla "A" hacer una consulta que como resultado de la suma de los pagos de cada cuenta 
5.- agregar ese resultado a la tabla "A"
6.- hacer una ultima consulta a la tabla "A" y si lo que deverian de haber pagado es lo que han pagado hacer un update al campo observaciones de la tabla cuentas que diga FINIQUITADO
de lo contrario mandar los registros a un archivito de texto para revisar manualmente las cuentas si es que tuvieron una condonacion o algo por el estilo

Si no me entienden la loca idea lo sabre entender

SE ACEPTAN SUGERENCIAS DE PROCEDIMIENTOS MAS SENCILLOS


  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 08 enero 2010 - 01:24

una aplicación en delphi recorres del primero al ultimo registro y en cada iteraccion vas calculando, pienso que es mas fácil que querer hacerlo en una consulta SQL.  Ahora lo que no me queda claro es que si este es un proceso repetitivo de ser así hay que buscar otra manera.
  • 0

#3 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 08 enero 2010 - 01:34

no ps no
no es algo que se tenga que hacer de hecho el programa que tienen originalmente deveria de hacer esa funcion pero no la hace
es cosa excepcional y unica para no tener que hacerla manual
ya que la cantidad de registros que estan en ceros con
pasaditos  de cuarenta mil
hacerlo manual seria demasiada perdida de tiempo hombre

pero dime eduarcol tu vez el procedimiento logico ?
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 08 enero 2010 - 01:47

Hola.

Yo creo que lo puedes calcular bien en una sola consulta, no hace falta que montes esa tabla nueva, ni todos esos pasos intermedios que has comentado.

Para ello puedes utilizar subconsultas (consultas dentro de consultas).

Se trata de lanzar una consulta sobre la tabla de cuentas, y para cada cuenta se lanzan dos subconsultas que se comparan entre ellas. La primera subconsulta calcula deuda y la otra pagos.



sql
  1. SELECT cuentas.cuenta
  2. FROM cuentas
  3. WHERE (SELECT SUM(deudas.importe) FROM deudas WHERE deudas.cuenta = cuentas.cuenta) <>
  4.         (SELECT SUM(pagos.importe) FROM pagos WHERE pagos.cuenta = cuentas.cuenta)



NOTA: No te preocupes por los niveles de anidación de la función IF. No deberías tener problemas con ello.

Claro que deberías tener en cuenta lo de si la deuda está finiquitada, etc. ... Se trata de ir refinando las subconsultas.

Saludos.
  • 0

#5 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 08 enero 2010 - 02:27

si el programa lo esta dando en cero entonces seria un procedimiento recurrente, ya que siempre hay que rectificar los datos ingresados.

Así que lo mejor seria una consulta, la idea de marc esta buena, una consulta con sub consultas es la forma mas facial.
  • 0

#6 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 18 enero 2010 - 02:01

por que no funciona ??


sql
  1. SELECT
  2. cuenta.id_cuenta,
  3. cuenta.folio,
  4. cuenta.no_credito,
  5. cuenta.nombre,
  6. cuenta.rfc,
  7. (
  8. SELECT
  9. cuenta.id_cuenta,
  10. cuenta.folio,
  11. cuenta.no_credito
  12. SUM(saldo.pago)
  13. FROM
  14. saldo
  15. INNER JOIN cuenta ON saldo.id_cuenta = cuenta.id_cuenta
  16. WHERE
  17. saldo.autorizado=1
  18. GROUP BY
  19. saldo.id_cuenta
  20. )
  21. FROM
  22. cuenta
  23. INNER JOIN saldo ON cuenta.id_cuenta = saldo.id_cuenta
  24. WHERE
  25. GROUP BY
  26. cuenta.id_cuenta



  • 0

#7 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 18 enero 2010 - 02:02

En esa consulta te falta amarrar las llaves para indicar que sumario mostrar. Prueba con esta consulta que te devuelve el sumario pro cada cuenta




sql
  1.       SELECT cuenta.id_cuenta, cuenta.folio, cuenta.no_credito,
  2.             cuenta.nombre, cuenta.rfc, Sumario.PagoTotal
  3.         FROM cuenta
  4.   INNER JOIN saldo
  5.           ON cuenta.id_cuenta = saldo.id_cuenta
  6.   LEFT JOIN (
  7.                 SELECT cuenta.id_cuenta,cuenta.folio, cuenta.no_credito,
  8.                         SUM(saldo.pago) AS PagoTotal
  9.                   FROM  saldo
  10.             INNER JOIN cuenta ON saldo.id_cuenta = cuenta.id_cuenta
  11.                 WHERE saldo.autorizado=1
  12.               GROUP BY cuenta.id_cuenta,cuenta.folio, cuenta.no_credito
  13.             ) AS sumario
  14.         ON cuenta.id_cuenta = Sumario.id_cuenta


  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 18 enero 2010 - 02:14

Hola.

Una subconsulta solo puede devolver un valor, y tu estás intentando devolver varios campos.

Además no has hecho bien el enlace entre la subconsulta interna y la externa (mira la sintaxis en el sencillo ejemplo que te puse hace unos días).

Y finalmente en una agrupación GROUP BY tienes que especificar que se agrupa por todos los campos que no estén afectados por una función de agregado SUM(), MAX(), ...  Aunque realmente en este caso no necesitas para nada la agrupación.

La consulta que quieres hacer creo que es bastante sencilla y te has ido complicando sin necesidad :



sql
  1. SELECT
  2. cuenta.id_cuenta,
  3. cuenta.folio,
  4. cuenta.no_credito,
  5. cuenta.nombre,
  6. cuenta.rfc,
  7. (
  8. SELECT
  9. SUM(saldo.pago)
  10. FROM
  11. saldo
  12. WHERE
  13. saldo.id_cuenta = cuenta.id_cuenta AND saldo.autorizado=1
  14. ) AS PAGOS
  15. FROM
  16. cuenta
  17.  


  • 0

#9 root

root

    mister

  • Miembro Platino
  • PipPipPip
  • 529 mensajes
  • LocationMexico D.F:

Escrito 19 enero 2010 - 04:00

lo del left join fue la salvacion
ya que lo que kiero es como decias marc
de una subconsulta tener varios resultados no solo uno
te comento
la base de datos actualmente no tiene un campo que diga saldo a la fecha
o algo asi ( creo yo que lo necesita para hacer las busquedas mas agiles.
pero lo que necesitaba en ese momento era saber cuanto havia pagado cada uno de los
deudores que tengo registrados

  • 0




IP.Board spam blocked by CleanTalk.