[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