[firebase-br] select adicionando colunas com where diferente é possível ?
Sandro Souza
escovadordebits em gmail.com
Qua Jan 20 20:19:29 -03 2016
Bom dia/tarde/noite/madrugada Washington.
Não sei se foi o chá de cogumelo azedo que eu tomei agora a pouco, mas
pensei na seguinte solução...
Primeiro, juntei todos os registros de compras e vendas em um único SELECT,
gerando uma massa de dados que ainda deve ser trabalhada.
Por favor, teste esse código, que não é a solução final, mas com ele você
poderá ver a massa de dados que será tratada mais à frente:
select
pr.codproduto,
sum(case when mo.tipo_movimentacao = 'compra' then mp.qtde else 0
end)qtde_compra,
sum(case when mo.tipo_movimentacao = 'compra' then mp.valor else 0
end)valor_compra,
sum(case when mo.tipo_movimentacao = 'compra' then 1 else 0
end)registros_compra,
sum(case when mo.tipo_movimentacao = 'compra' then (mp.qtde * mp.valor)
else 0 end)total_compra,
sum(case when mo.tipo_movimentacao = 'venda' then mp.qtde else 0
end)qtde_venda,
sum(case when mo.tipo_movimentacao = 'venda' then mp.valor else 0
end)valor_venda,
sum(case when mo.tipo_movimentacao = 'venda' then 1 else 0
end)registros_venda,
sum(case when mo.tipo_movimentacao = 'venda' then (mp.qtde * mp.valor)
else 0 end)total_venda
from
movimento mo,
movimento_produtos mp,
produtos pr
where
(mo.tipo_movimentacao in('compra','venda'))and
(mo.data between '01.12.2015' and '31.12.2015')and
(mp.codoperacao = mo.codoperacao)and
(pr.produto = mp.produto)
group by
pr.codproduto
Calcular puramente a média do valor das compras e do valor das vendas não
iria funcionar nessa arquitetura (a forma que foi desenhada a tabela),
porque o cálculo da média também contabilizaria os vários zeros gerados nas
vendas para o cálculo do valor médio de compra, como também contabilizaria
os vários zeros gerados nas compras para o cálculo do valor médio de venda.
Então precisaremos de uma forma para contabilizar os registros reais de
compra e de venda.
Note que a coluna "registros_compra" contabiliza o total de registros de
compra, e a coluna "registros_venda" contabiliza o total de registros de
venda.
Com isso, conseguiremos calcular corretamente o valor médio de compra e o
de venda.
Agora, criando um SELECT mais externo, que use o resultado do primeiro
SELECT e faça um novo tratamento nos dados gerados, ficaria assim:
select
x.codproduto,
x.qtde_compra,
case when x.registros_compra = 0 then 0 else (x.valor_compra /
x.registros_compra) end valor_medio_compra,
x.total_compra,
x.qtde_venda,
case when x.registros_venda = 0 then 0 else (x.valor_venda /
x.registros_venda) end valor_medio_venda,
x.total_venda,
(x.total_compra - x.total_venda)saldo
from (
select
pr.codproduto,
sum(case when mo.tipo_movimentacao = 'compra' then mp.qtde else 0
end)qtde_compra,
sum(case when mo.tipo_movimentacao = 'compra' then mp.valor else 0
end)valor_compra,
sum(case when mo.tipo_movimentacao = 'compra' then 1 else 0
end)registros_compra,
sum(case when mo.tipo_movimentacao = 'compra' then (mp.qtde * mp.valor)
else 0 end)total_compra,
sum(case when mo.tipo_movimentacao = 'venda' then mp.qtde else 0
end)qtde_venda,
sum(case when mo.tipo_movimentacao = 'venda' then mp.valor else 0
end)valor_venda,
sum(case when mo.tipo_movimentacao = 'venda' then 1 else 0
end)registros_venda,
sum(case when mo.tipo_movimentacao = 'venda' then (mp.qtde * mp.valor)
else 0 end)total_venda
from
movimento mo,
movimento_produtos mp,
produtos pr
where
(mo.tipo_movimentacao in('compra','venda'))and
(mo.data between '01.12.2015' and '31.12.2015')and
(mp.codoperacao = mo.codoperacao)and
(pr.produto = mp.produto)
group by
pr.codproduto)x
Bom, não pude testar essa proposta de solução, mas acredito que seja algo
parecido com isso.
Espero ter ajudado mais que atrapalhado. :D
Em 20 de janeiro de 2016 15:35, Washington Moratti de Oliveira <
ti em cbnmodas.com.br> escreveu:
> Olá amigos da firebase,
> Vejam se podem me ajudar.
> Como proceder para fazer uma busca comparando dados da mesma tabela,
> mudando
> somente a clausula do where.
>
> Preciso retornar do meu bd uma consulta que envolve várias tabelas, até ai
> tudo bem resolvo com o inner join.
> Segue um exemplo:
>
> select pr.codproduto, sum(mp.qtde), avg(mp.valor), (mp.qtde * mp.valor)as
> total
> from movimento mo
> inner join movimento_produtos mp on mp.codoperacao=mo.codoperacao
> inner join produtos pr on pr.produto=mp.produto
> where mo.tipo_movimentacao = 'venda'
> and mo.data between '01.12.2015' and '31.12.2015'
> group by pr.codproduto
>
> Retorna:
> CODPRODUTO QTDE VALOR TOTAL
> PRODUTO A 50 20 1000
> PRODUTO B 25 05 125
> PRODUTO C 03 15 45
> ...
>
> Isso é referente a clausula tipo_movimentacao = VENDA
> então nessa mesma consulta adicionando uma nova coluna com o resultado
> da clausula = 'COMPRA'
> e uma coluna com SALDO que seria o resultado da coluna QTDE de COMPRA -
> QTDE
> de VENDA.
> É possível ?
>
> Desde já agradeço a todos!
>
> Where>>>>> =======VENDA======== =======COMPRA======== QTDE ESTOQUE
> CODPRODUTO QTDE VALOR TOTAL QTDE VALOR TOTAL SALDO
> PRODUTO A 50 20 1000 300 10 3000 250
> PRODUTO B 25 05 125 30 05 150 05
> PRODUTO C 03 15 45 13 07 91 10
> ...
>
> Saudações,
>
> Washington M.
> Encarregado de T.I
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>
Mais detalhes sobre a lista de discussão lista