Ir para conteúdo

POWERED BY:

Arquivado

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

ivanferrer

Como melhorar uma Query em SQL com Soma de SubQuerys

Recommended Posts

Como posso somar as linhas na query, pois preciso somar os resultados das linhas mas não está funcionando... tipo SUM(LINHA_1 + LINHA_2 ...) AS TOTAL_LINHAS
Tem alguma forma de fazer isso?

 

SELECT
        revenda.rvd_id AS ID,
		SUM(IF( venda.vnd_dt BETWEEN '2013-02-01' AND '2013-03-31', venda.vnd_faturamento, 0 ) ) AS FATURAMENTO_P1,
		SUM(IF( venda.vnd_dt BETWEEN '2013-01-01' AND '2013-01-31', venda.vnd_faturamento, 0 ) ) AS FATURAMENTO_P2,
		SUM(IF( venda.vnd_dt BETWEEN '2012-12-01' AND '2012-12-31', venda.vnd_faturamento, 0 ) ) AS FATURAMENTO_P3,

(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=1 and venda.rvd_id=revenda.rvd_id) AS LINHA_1,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=2 and venda.rvd_id=revenda.rvd_id) AS LINHA_2,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=3 and venda.rvd_id=revenda.rvd_id) AS LINHA_3,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=4 and venda.rvd_id=revenda.rvd_id) AS LINHA_4,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=5 and venda.rvd_id=revenda.rvd_id) AS LINHA_5,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=6 and venda.rvd_id=revenda.rvd_id) AS LINHA_6,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=7 and venda.rvd_id=revenda.rvd_id) AS LINHA_7,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=8 and venda.rvd_id=revenda.rvd_id) AS LINHA_8,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=9 and venda.rvd_id=revenda.rvd_id) AS LINHA_9,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=10 and venda.rvd_id=revenda.rvd_id) AS LINHA_10,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=11 and venda.rvd_id=revenda.rvd_id) AS LINHA_11,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=12 and venda.rvd_id=revenda.rvd_id) AS LINHA_12,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=13 and venda.rvd_id=revenda.rvd_id) AS LINHA_13,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=14 and venda.rvd_id=revenda.rvd_id) AS LINHA_14,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=15 and venda.rvd_id=revenda.rvd_id) AS LINHA_15,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=16 and venda.rvd_id=revenda.rvd_id) AS LINHA_16,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=17 and venda.rvd_id=revenda.rvd_id) AS LINHA_17,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=18 and venda.rvd_id=revenda.rvd_id) AS LINHA_18,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=19 and venda.rvd_id=revenda.rvd_id) AS LINHA_19,
(SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id=20 and venda.rvd_id=revenda.rvd_id) AS LINHA_20,
        IF(ISNULL(revenda.rvd_cnpj_matriz), revenda.rvd_razao, r.rvd_razao) AS RAZAO,
        IF(ISNULL(revenda.rvd_cnpj_matriz), revenda.ctg_rvd_id, r.ctg_rvd_id) AS CATEGORIA_REVENDA_ATUAL,
        IF(ISNULL(revenda.rvd_cnpj_matriz), revenda.rvd_uf, r.rvd_uf) AS UF,
        IF(ISNULL(revenda.rvd_cnpj_matriz), revenda.rvd_ativa, r.rvd_ativa) AS 'Ativa',
        IF(ISNULL(revenda.rvd_cnpj_matriz), revenda.rvd_cnpj, r.rvd_cnpj) AS CNPJ,
        IF(ISNULL(revenda.rvd_cnpj_matriz), 'Não', 'Sim') AS 'Matriz Agrupada' 

FROM venda 
LEFT OUTER JOIN produto
ON produto.prd_id=venda.prd_id

LEFT OUTER JOIN revenda
ON revenda.rvd_id=venda.rvd_id

LEFT OUTER JOIN revenda r
ON revenda.rvd_cnpj_matriz = r.rvd_cnpj

WHERE venda.vnd_faturamento IS NOT NULL  AND revenda.usr_id IS NOT NULL  AND (produto.ctg_id IS NOT NULL AND produto.prd_id IS NOT NULL AND revenda.ctg_rvd_id IS NOT NULL)
AND venda.vnd_dt BETWEEN '2012-12-01' AND '2013-03-31' 
AND venda.vnd_erro = 1 
GROUP BY IFNULL(revenda.rvd_cnpj_matriz,revenda.rvd_id)
ORDER BY revenda.rvd_razao, venda.vnd_faturamento DESC, venda.vnd_dt DESC;

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT COUNT(produto.lnh_id) FROM produto LEFT OUTER JOIN venda ON produto.prd_id = venda.prd_id WHERE produto.lnh_id between 1 and 20 and venda.rvd_id=revenda.rvd_id) AS SOMA_LINHA_20,

mas tente melhorar esta query ...

 

Usando CASE talvez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

se eu colocar BETWEEN 1 and 20, não vai fazer diferença, pois ele irá contar todos os produtos que deveriam ser contados distintamente como se fossem uma coisa só...ou seja, ele vai contar o ID 1, 2, 3, 4, 5 ... 20 como se fosse uma coisa só...

daí nem faria muita diferença se eu colocasse o intervalo...

eu preciso que seja contato o número total de familias de linhas...tipo:



lnh_id
2
2
2
4
4
5
1
3
1
1

1 - familia 2: 3
2 - familia 4: 2
3 - familia 5: 1
4 - familia 1: 3
5 - familia 3: 1

Total que eu não quero: 3 + 2 + 1 + 3 + 1 = 10 (total contato pelo count)
Total que eu quero: número de famílias distintas: 5
Entendeu o problema...



No PHP, eu resolvi assim:


for($x=1; $x<=20; $x++){
   if($value['LINHA_'.$x]>0)
      $somaTotalFamilia++;
   }

 

Mas queria melhor pela query, é possível?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Era para acrescentar a sql com between as outras 20.Ela vai totalizar as demais.

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.