Bienvenido Club Delphi, y muchas Felicidades por su nuevo aspecto.
Uso Firebird 1.53 con IBExpert 2006
Buen día tengan compañeros, les informo mi problema, tengo una consulta que tiene la finalidad de Sacar las Ventas Netas = Ventas - (Devoluciones + Notas de Crédito) del Año Actual y el Año Anterior, ahora bien, todo marcha bien hasta toparme con el ORDER BY , del cual quiero ordenar por el TOTAL del Año Actual Descendentemente donde este campo Virtual esta posicionado en el campo 6 de la propia consulta pero si la ejecuto tarda más de 6 minutos, pongo la Sentencia SQL:
Código SQL
[-]
SELECT FIRST 20 F.CLAVEART,A.DESART,A.MARCA,A.GRUPO,
COALESCE(SUM(F.CANTIDAD),0)-
(SELECT COALESCE(SUM(CANTIDAD),0) FROM TINV_INVMOVIM
WHERE (TIPOMOV='DM' OR TIPOMOV='DX') AND
CLAVEART = F.CLAVEART AND
FECHAMOV BETWEEN '01.01.2006' AND '24.03.2006') CANTIDAD,
COALESCE(SUM(F.IMPSIVA),0)-
((SELECT COALESCE(SUM(IMPORTE),0) FROM TINV_INVMOVIM
WHERE (TIPOMOV='DM' OR TIPOMOV='DX') AND
CLAVEART = F.CLAVEART AND
FECHAMOV BETWEEN '01.01.2006' AND '24.03.2006')+
(SELECT CASE WHEN COALESCE(SUM(C.IMPARTNC),0)>0 THEN COALESCE(SUM(C.IMPARTNC),0) ELSE 0 END FROM TCXC_CLIMOVIM C
RIGHT JOIN TFAC_FACTURAS FF ON (FF.TIPOMOV = SUBSTRING(C.FACTURA FROM 1 FOR 2) AND FF.FOLIOFISCAL= CAST(SUBSTRING(C.FACTURA FROM 3 FOR 6) AS INTEGER))
RIGHT JOIN TFAC_DFACTURAS FD ON (FD.TIPOMOV = FF.TIPOMOV AND FD.FOLIO = FF.FOLIO AND FD.CLAVEART=F.CLAVEART)
WHERE (TIPOMOV='NM' OR TIPOMOV='NX') AND
FECHAMOV BETWEEN '01.01.2006' AND '24.03.2006')) TOTAL,
(SELECT COALESCE(SUM(IMPSIVA),0) FROM TFAC_DFACTURAS
WHERE CLAVEART = F.CLAVEART AND TIPOMOV ='FM' AND
FECHAFAC BETWEEN '01.01.2005' AND '24.03.2005') -
((SELECT COALESCE(SUM(IMPORTE),0) FROM TINV_INVMOVIM
WHERE (TIPOMOV='DM' OR TIPOMOV='DX') AND
CLAVEART = F.CLAVEART AND
FECHAMOV BETWEEN '01.01.2005' AND '24.03.2005') +
(SELECT CASE WHEN COALESCE(SUM(C.IMPARTNC),0)>0 THEN COALESCE(SUM(IMPARTNC),0) ELSE 0 END FROM TCXC_CLIMOVIM C
RIGHT JOIN TFAC_FACTURAS FF ON (FF.TIPOMOV = SUBSTRING(C.FACTURA FROM 1 FOR 2) AND FF.FOLIOFISCAL = CAST(SUBSTRING(C.FACTURA FROM 3 FOR 6) AS INTEGER))
RIGHT JOIN TFAC_DFACTURAS FD ON (FD.TIPOMOV = FF.TIPOMOV AND FD.FOLIO = FF.FOLIO AND FD.CLAVEART=F.CLAVEART)
WHERE (TIPOMOV='NM' OR TIPOMOV='NX') AND
FECHAMOV BETWEEN '01.01.2005' AND '24.03.2005')) TOTANT,
(SELECT COALESCE(SUM(CANTIDAD),0) FROM TFAC_DFACTURAS
WHERE CLAVEART = F.CLAVEART AND
TIPOMOV ='FM' AND
FECHAFAC BETWEEN '01.01.2005' AND '24.03.2005') -
(SELECT COALESCE(SUM(CANTIDAD),0) FROM TINV_INVMOVIM
WHERE (TIPOMOV='DM' OR TIPOMOV='DX') AND
CLAVEART = F.CLAVEART AND
FECHAMOV BETWEEN '01.01.2005' AND '24.03.2005') CANTANT
FROM TFAC_DFACTURAS F
JOIN TINV_ARTICULOS A ON (F.CLAVEART = A.CLAVEART)
WHERE F.FECHAFAC BETWEEN '01.01.2006' AND '24.03.2006' AND
F.TIPOMOV ='FM'
GROUP BY F.CLAVEART,A.DESART,A.MARCA,A.GRUPO
ORDER BY 6 DESC
Ahora bien, si cambio el Order By a :
ORDER BY COALESCE(SUM(F.IMPSIVA),0) DESC
tarda 6 Segundos, pero no me ordenará correctamente la consulta debido a que solo estoy ordenando las VENTAS y no estoy considerando las
Devoluciones y Notas de Crédito, mi duda es la siguiente:
Será lo mismo poner ORDER BY TOTAL DESC que ORDER BY 6 DESC ????
en el primero me marca error que columna no se reconoce, lo que pasa es que la columna virtual
TOTAL tiene el importe TOTAL NETO que quiero ordenar, mi objetivo es Disminuir el tiempo de la consulta a 10 ó 20 segundos, espero que alguien me haya entendido, si no estoy a sus ordenes.
Nota: Al poner ORDER BY 6 DESC si me hace el ordenamiento correcto pero la consulta es demasiada lenta, con decirles que si quito el
ORDER BY 6 DESC y
First 20 la consulta tarda 10 Segundos para traerme todos los registros y apenas son 5,000 Registros
Se podrá Crear un
INDICE TEMPORAL PARA EL CAMPO CALCULADO
TOTAL ????
Agradezco cualquier Ayuda.