[firebase-br] RES: select adicionando colunas com where diferente é possível ?
Washington Moratti de Oliveira
ti em cbnmodas.com.br
Qui Jan 21 10:01:17 -03 2016
Grande Sandro,
Continue com seu abençoado chá rsss
Pois logo que adaptei a consulta aqui seguindo sua linha de raciocínio foi certeiro.
fiz alguns ajustes e consegui o resultado esperado.
Quero agradecer sua atenção e boa vontade dispensada ao problema proposto e agradeço também a comunidade.
===========================================================================================
select x.cod_produto, x.qtdeCompra, case when x.registrosCompra = 0 then 0
else (x.valorCompra / x.registrosCompra) end valorMedioCompra,
x.totalCompra,x.qtdeVenda, case when x.registrosVenda = 0 then 0
else(x.valorVenda/x.registrosVenda) end valorMedioVenda,
x.totalVenda,(x.qtdeCompra-x.qtdeVenda)Saldo
from(
select pr.cod_produto,
sum(case when ev.codigo = '001' then pe.quantidade else 0 end)qtdeCompra,
sum(case when ev.codigo = '001' then pe.preco_total else 0 end)valorCompra,
sum(case when ev.codigo = '001' then 1 else 0 end)registrosCompra,
sum(case when ev.codigo = '001' then (pe.quantidade * pe.preco_total) else 0 end)TotalCompra,
sum(case when ev.codigo = '068' then pe.quantidade else 0 end)qtdeVenda,
sum(case when ev.codigo = '068' then pe.preco_total else 0 end)ValorVenda,
sum(case when ev.codigo = '068' then 1 else 0 end)registrosVenda,
sum(case when ev.codigo = '068' then pe.quantidade * pe.preco_total else 0 end)TotalVenda
from
movimento mo,
produtos_eventos pe,
produtos pr,
eventos ev,
filiais fi
where
(ev.codigo in ('001','068')) and (mo.data between '01.07.2015' and '31.12.2015') and (fi.cod_filial='16')
and (mo.cancelada = 'F') and (pr.tipo_prod = 'AC')
and (mo.cod_operacao=pe.cod_operacao) and (pe.produto=pr.produto)
and (mo.evento=ev.evento) and (mo.filial=fi.filial)
group by pr.cod_produto)x
=========================================================================================================
Fiquem com Deus.
Att,
Washington M
Encarregado de T.I
De: Sandro Souza [mailto:escovadordebits em gmail.com]
Enviada em: quarta-feira, 20 de janeiro de 2016 20:19
Para: FireBase; Washington Moratti de Oliveira
Assunto: Re: [firebase-br] select adicionando colunas com where diferente é possível ?
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