[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