Hola amigos.
Tengo el siguiente codigo que funciona... pero considero que es muy lento (en una tabla con 50.000 registros se toma 20 segundos)
Tiene alguno de ustedes la menera de agilizar esta consulta?
Si le quito el having, se toma unicamente .90 secs. ( con el SqlYog)
me pareciera que necesitas agregar un order by
ya que la el having sum(debe-haber) no esta noptimizado, asumiendo que la tabla este ordenada por fechamis y numdoc
SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas
GROUP BY numdoc
HAVING SUM(debe-haber) > 0 ORDER BY numdoc;
No hay ninguna diferencia. La tabla fue creada con el index numdoc.
Saludos.
SELECT res.fechemis,res.numdoc, res.debitos, res.creditos, res.diferencia from (
SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas
GROUP BY numdoc ) res
where res.diferencia > 0 ORDER BY res.numdoc;
Con 280000 registros tarda 5 seg.
Last edited by cmsoft on Thu Oct 25, 2018 11:30 pm, edited 1 time in total.
SELECT res.fechemis,res.numdoc, res.debitos, res.creditos, res.diferencia from (
SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia
FROM facturas
GROUP BY numdoc ) res
where res.diferencia > 0 ORDER BY res.numdoc;
Con 280000 registros tarda 5 seg.
Gracias, cmsoft. Lo voy a probar y luego te comento.
oCuadrar := oServer:Query("SELECT res.fechemis,res.numdoc, res.debitos, res.creditos, res.diferencia from (" +;
" SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia " +;
" FROM facturas" +;
" GROUP BY numdoc ) res" +;
" WHERE res.diferencia > 0 ORDER BY res.numdoc;")
increible. El tiempo por 98.000 registros es de 61 segundos. Extremadamente lento.
No lo entiendo.
Disculpa, cmsoft. Error mio por haber copiado, pegado y compilado, olvidando que en mi programa lo tengo en un DO WHILE en el que proceso varias tablas mysql.
Lo he corregido, sin embargo el tiempo unicamente a bajado a 17.25 segundos, el cual es malo, comparado con tu ejemplo.
Gracias.
Carlos.
Muchas gracias por tu interés.
He optado por separar la función, del procedimiento general de actualización de saldos, ya que ésta únicamente la he creado para re-confirmar si las transacciones balancean.
Me he decidido por lo anterior, en vista de que antes de grabar cada documento, se chequean sus transacciones.
Todo se debe a que el usuario debe tener la seguridad de que todo está bien antes de emitir los Estados Financieros.
Oliveiros.
Todo lo contrario, agradezco tu interés en ayudarme.
En alguna parte del manual he visto que AS es opcional:
"Aprovechemos la ocasión para mencionar que también es posible asignar un alias a cualquiera de las expresiones select. Esto se puede hacer usando la palabra AS, aunque esta palabra es opcional".:
El resultado deberia ser el mismo, solo que la condicion no está sobre un campo calculado. lo que sospecho que le está dando más trabajo. De hecho la columna diferencia se podría suprimir y en el codigo usar la diferencia de las columnas debitos y creditos.
El resultado deberia ser el mismo, solo que la condicion no está sobre un campo calculado. lo que sospecho que le está dando más trabajo. De hecho la columna diferencia se podría suprimir y en el codigo usar la diferencia de las columnas debitos y creditos.
Hola Carlos.
La primera opcion da el error:
Query: SELECT fechemis,numdoc, sum(debe) debitos, sum(haber) creditos, sum(debe-haber) diferencia FROM facturas GROUP BY numdoc WHERE ...
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE debitos > creditos
La segunda tarda 16.046 secs, sobre 59.605 registros.