Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jalenfabio

Otimizar Sql com Subqueries no Select

Recommended Posts

Olá amigos,

 

Venho há alguns dias tentando implementar uma consulta em meu sistema e obtive alguns avanços que foi juntar 4 queries numa única query e trazendo os resultados que espero.

O problema agora é que esse query está levando uma eternidade para ser executada, 77segundos e está causando lentidão no banco.

Alguém pode me dar uma luz ou indicar um caminho de como posso otimizá-la? Agradeço imensamente a ajuda.

 

Eis a bendita SQL abaixo:

 

SELECT distinct loja, sum(valor) AS VendasUlt3MesesAnoAtual,
(
SELECT sum(valor) FROM movimentocaixa WHERE dt BETWEEN '2015-01-01' AND '2015-03-31' and loja = c1.loja
) as VendasUlt3MesesAnoAnterior,
(
SELECT sum(valor) FROM movimentocaixa WHERE dt BETWEEN '2016-03-01' AND '2016-03-13' and loja = c1.loja
) as VendasMesAnterior,
(
SELECT sum(valor) FROM movimentocaixa WHERE dt BETWEEN '2016-04-13' AND '2016-04-13' and loja = c1.loja
) as VendasMesAtual
FROM movimentocaixa as c1
WHERE dt BETWEEN '2016-01-01' AND '2016-03-31'
GROUP BY loja
ORDER BY VendasUlt3MesesAnoAtual DESC
O resultado obtido é esse:
Affected rows: 0
Time: 77.727s
loja	VendasUlt3MesesAnoAtual	VendasUlt3MesesAnoAnterior	VendasMesAnterior	VendasMesAtual
LOJA 5	2632421,10	2022353,53	368113,00	23388,00
LOJA 3	2327314,73	2178233,02	247287,70	15721,00
LOJA 2	2213231,92	2231044,84	254241,00	5800,00
LOJA 1	2093777,40	2048775,54	266952,00	31142,10
LOJA 4	2016085,51	2356516,00	155131,00	1600,00
LOJA 7	2001787,04	1414073,62	277461,04	12302,00
LOJA 6	1625002,90	1662649,26	248631,00	8490,00

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente fazer em uma qyery só com CASE, é um select ao menos

SELECT sum(case when dt BETWEEN '2015-01-01' AND '2015-03-31' then valor else 0 end) as VendasUlt3MesesAnoAnterior,
       sum(case when dt BETWEEN '2016-03-01' AND '2016-03-13' then valor else 0 end) VendasMesAnterior,
       ...
FROM movimentocaixa
WHERE loja = c1.loja

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sensacional amigo Motta,

 

Não conhecia o comando case. Vc solucionou meu problema. Muito obrigado mesmo.

Agora a query está trazendo o mesmo resultado e em menos de 1 segundo.

Pra ajudar a outros que tenham o mesmo problema, abaixo coloco a query como ficou:

 

 

SELECT loja,

sum(case when dt BETWEEN '2015-01-01' AND '2015-03-31' then valor end) AS VendasUltAnoAnterior,
sum(case when dt BETWEEN '2016-01-01' AND '2016-04-13' then valor end) AS VendasUltAnoAtual,
sum(case when dt BETWEEN '2016-03-01' AND '2016-03-13' then valor end) AS VendasMesAnterior,
sum(case when dt BETWEEN '2016-04-01' AND '2016-04-13' then valor end) AS VendasMesAtual
FROM movimentocaixa
GROUP BY loja
ORDER BY VendasMesAtual DESC

 

Se precisarem de algo, contem comigo.

Forte abraço,

 

 

Tente fazer em uma qyery só com CASE, é um select ao menos

SELECT sum(case when dt BETWEEN '2015-01-01' AND '2015-03-31' then valor else 0 end) as VendasUlt3MesesAnoAnterior,
       sum(case when dt BETWEEN '2016-03-01' AND '2016-03-13' then valor else 0 end) VendasMesAnterior,
       ...
FROM movimentocaixa
WHERE loja = c1.loja

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.