Fórum CONSULTAR PRODUTOS REPETIDOS E SOMÁ-LOS [firebird+sql] #471284
25/02/2014
0
Está funcionando normalmente.
Pra isso , tive que unir duas tabelas "alteraca" e "estoque" para obter todas as informacoes necessárias, além de informar o seguinte comando sql na query1 "SELECT* FROM ESTOQUE JOIN ALTERACA ON ESTOQUE.CODIGO = ALTERACA.CODIGO;" dizendo que o codigo da tabela estoque é o mesmo codigo da tabela alteraca.
PROBLEMA: o mesmo item repete varias vezes em datas diferentes e com sua quantidade vendida.
SOLUCAO: Mostrar apenas um desse item e somar suas quantidades vendidas dentro do periodo informado.
Conseguir obter essas informacoes de apenas 1 item e somá-los assim: "SELECT PEDIDO, DESCRICAO, COUNT (*) total FROM ALTERACA GROUP BY DESCRICAO; "
Agora vem a grande questão: Como fazer as duas coisas ao mesmo tempo.
Mostrar todos os produtos vendidos dentro do periodo, sem repetir-los, mostrar a soma total do item vendido dentro do periodo.
Exemplo:
COMO ESTA SAINDO NO PRIMEIRO COMANDO SQL
produto med precovenda qtdvendeu qtdinicio qtdatual datavenda
item a und R$ 2,00 2 10 2 01.01.2014
item a und R$ 2,00 5 10 2 01.01.2014
item a und R$ 2,00 1 10 2 01.01.2014
RELATORIO DESEJADO
produto med precovenda qtdvendeu qtdinicio qtdatual datavenda
item a und R$ 2,00 8 10 2 01.01.2014
QTDINICIO:= QTDATUAL+QTDVENDEU
QTDATUAL := É a informacao da tabela do banco
QTDVENDEU:= É a quantidade vendida no período informado.
Alguém pode me ajudar?
Francisco Aurino
Curtir tópico
+ 0Post mais votado
26/02/2014
Eu nao entendi muito bem.
Mas dependendo de como esta querendo fazer veja se este codigo ajuda.
SELECT ESTOQUE.DESCRICAO, COUNT(DISTINCT(ESTOQUE.CODIGO)) QTDITENS,SUM(ALTERACA.QTDVENDEU) QTDVENDIDA FROM ESTOQUE JOIN ALTERACA ON ESTOQUE.CODIGO = ALTERACA.CODIGO GROUP BY ESTOQUE.DESCRICAO
Espero que ajude.
Abraco.
Alex - lekao
Alex Lekao
Gostei + 1
Mais Posts
26/02/2014
William
Gostei + 0
26/02/2014
Francisco Aurino
o comando enviado resolveu filtrando por data e somando as quantidades em apenas um item.
Agora não consigo visualizar as demais informações, das vendas como mostra nas imagens em anexo.
Cada imagem, tem o comando SQL que trata o resultado da informação..
Tem como fazer os procedimentos em apenas um?
Primeiro comando SQL funcionou as datas o estoque e descricao
[ select * from estoque join ALTERACA ON ESTOQUE.CODIGO = ALTERACA.CODIGO where data between '2014-01-31' and '2014-01-31' ; ]
segundo comando SQL mostra tudo mas repeti os produtos, e nao soma a quantidade em apenas um produto.
[SELECT ESTOQUE.DESCRICAO, COUNT(DISTINCT(ESTOQUE.CODIGO)) TOTAL1,SUM(ALTERACA.QUANTIDADE) QTD_ATUAL FROM ESTOQUE JOIN ALTERACA ON ESTOQUE.CODIGO = ALTERACA.CODIGO where data between '2014-01-31' and '2014-01-31' GROUP BY
ESTOQUE.DESCRICAO;]
Segue os prints de cada comando e resultado da tabela: Estoque e Alteraca.
Alguém podem ajudar!?
[img:descricao=Primeido Comando SQL]http://arquivo.devmedia.com.br/forum/imagem/339657-20140226-202458.png[/img]
[img:descricao=Segundo comando SQL]http://arquivo.devmedia.com.br/forum/imagem/339657-20140226-202522.png[/img]
Gostei + 0
27/02/2014
Alex Lekao
Vc precisa realmente de todos os campos da tabela? nao eh recomendavel ficar usando * para todos os campos, liste os campos que vc precisa.
caso vc queira mais campos para informacao, vc pode coloca-los na relacao de campos no select e adicionar os mesmos campos no group by que ele vai agrupando e calculando conforme vc precisa.
Dependendo do que vc esta querendo sera necessario um subselect para trazer os resultados.
Espero ter ajudado.
Abraco.
Alex - Lekao
Gostei + 1
27/02/2014
Francisco Aurino
Ou como faco para gerar o resultado das duas telas de uma só vez?
Gostei + 0
27/02/2014
Alex Lekao
Nao estou compreendendo bem o que esta precisando.
Mas os dois Scripts sao praticamente identicos.
a diferenca eh que um esta somando e o outro nao.
somando com escolha de campoas
SELECT ESTOQUE.DESCRICAO, COUNT(DISTINCT(ESTOQUE.CODIGO)) TOTAL1,SUM(ALTERACA.QUANTIDADE) QTD_ATUAL FROM ESTOQUE JOIN ALTERACA ON ESTOQUE.CODIGO = ALTERACA.CODIGO where data between '2014-01-31' and '2014-01-31' GROUP BY ESTOQUE.DESCRICAO
sem somar, listando todos os campos(nao recomendado)
select * from estoque join ALTERACA ON ESTOQUE.CODIGO = ALTERACA.CODIGO where data between '2014-01-31' and '2014-01-31'
Agora se vc quer que mais campos que aparecem no segundo select que eu colei(copiado do seu post) eh so vc adicionar no script do primeiros select que colei(copiado do seu post).
Exemplo:
SELECT ESTOQUE.DESCRICAO, COUNT(DISTINCT(ESTOQUE.CODIGO)) TOTAL1, SUM(ALTERACA.QUANTIDADE) QTD_ATUAL, ESTOQUE.MED, ALTERACA.VENDIDOEM FROM ESTOQUE JOIN ALTERACA ON ESTOQUE.CODIGO = ALTERACA.CODIGO where data between '2014-01-31' and '2014-01-31' GROUP BY ESTOQUE.DESCRICAO,ESTOQUE.MED,ALTERACA.VENDIDOEM
e assim sucessivamente, os campos que nao serao calculados, vc lista na relacao de campos no select e repete os mesmos campos na relacao do group by.
Bom para um subselect.
vc pode fazer da seguinte forma.
SELECT
VENDIDOEM,
(SELECT
SUM(ESTOQUE.SALDO)
FROM ESTOQUE
WHERE ESTOQUE.CODIGO = ALTERACA.CODIGO) SALDOEST
FROM ALTERACA
WHERE DATA BETWEEN '2014-01-31' AND '2014-01-31'
isso eh so um exemplo, sempre faco desta forma no SQL Server e funciona, acredito que no firebird tbm deva funcionar.
Gostei + 1
28/02/2014
Francisco Aurino
Os procedimento SQL que vc enviou funcionaram certinho.
Mas agora não estou conseguindo fazer a seguinte rotina....
Tenho uma coluna chamada "Estoque Inicial" que gostaria somasse o "valor vendido" + o valor "estoque final".
A coluna chamada "estoque incial" não esta registrado a nenhuma coluna do banco de dados.
Como faço para fazer esse calculo e gerar para todos os produtos consultados o resultado nessa coluna "estoque inicial"?
E outra coisa...
Observe nas colunas dos valores em reais, que não consigo colocar no formado real, e alguns números estão ficando com até 4 casa decimais após a virgula.
Como faço para os numeros em reais ficarem no padrão com o CIFRÃO R$ e com apenas 2 dígitos após a virgula?
Segue o resultado da sua grande ajuda:
[img:descricao=Pesquisando por Código e Entre data, separadamente.]http://arquivo.devmedia.com.br/forum/imagem/339657-20140228-222410.png[/img]
Gostei + 0
28/02/2014
Francisco Aurino
preciso agora somente somar os dados listados na consulta...
E ai consegue!?
Gostei + 0
05/03/2014
Alex Lekao
Desculpe a demora, feriado prolongado, dei uma emendada para descansar.
Entao nao entendi muito bem mas acredito que vc tera que utilizar subselects tbm, para fazer esses calculos.
a formatacao de moeda vc nao conseguira pelo banco, tera que fazer na aplicacao, pelo menos desconheco esse tipo de formatacao pelo banco.
Caso julgue necessario post o codigo que vc usou com o comentario de que vc precisa somar com o que, os resultados da coluna x com a coluna Y ser elas foram subselects, vc pode usa-las com operadores matematicos normalmente.
Espero ter ajudado.
Abraco.
Alex - Lekao
Gostei + 1
05/03/2014
Francisco Aurino
No IBQUERY, em EVENTS, OnCalcALCFIelds, adicionei o codigo o comand sql abaixo:
DM.IBQCODIGOSTATUS1.asInteger:= DM.IBQCODIGOQTD_ATUAL.asInteger + DM.IBQCODIGOQUANTIDADE.asInteger;
Já o formato dos valores conseguir fazer assim:
Clique dublo na IBquery, selecione o field desejado para formatar, no meu caso, VALOR, em properties, no campo DISPLAY FORMAT adicionei assim: "R$ #,###0.00".
Agora o sistema esta calculando normalmente, mas com das datas no comando SQL conforme mostra abaixo:
[ SELECT ALTERACA.QUANTIDADE, ALTERACA.DATA, ALTERACA.DESCRICAO, ALTERACA.UNITARIO, ALTERACA.TOTAL, ALTERACA.PEDIDO, ALTERACA.MEDIDA, ALTERACA.STATUS, (SELECT SUM(ESTOQUE.QTD_ATUAL) FROM ESTOQUE WHERE ESTOQUE.CODIGO = ALTERACA.CODIGO) QTD_ATUAL FROM ALTERACA WHERE DATA BETWEEN '2014-01-01' AND '2014-01-31' ]
O problema agora que ainda não conseguir resolver:
1º - Tenho no Form1, os componentes DateTimePicker1(Data inicial) e DateTimePicker2(Data final). Não conseguir fazer o comando sql correto para pesquisar pelos componentes.
Qual procedimento devo fazer para consultar por data e clicando em um botão [PESQUISAR]?
2º - Por incrível que pareca, não consigo imprimir apenas os dados pesquisados. meu procedimento imprime tudo que consta no banco.
Qual procedimento para gerar o relatório direto em PDF, ai depois o usuário escolhe se imprime ou não. ?
Lembrando que o comando mencionado no início, funciona corretamente dentro do IBquery1, monstrando no DBgrid as informações conditas no comando SQL.
Deste já agradeço.
Gostei + 0
05/03/2014
Alex Lekao
Acredito que agora seja algo mais referente a progracao.
Nesta parte eu ja nao conheco nao terei como te ajudar.
Sugiro abrir algum post na sala referente a desenvolvimento, Java, Delphi, etc.
Desculpe por nao poder ajudar.
Abraco.
Alex - Lekao
Gostei + 1
05/03/2014
Francisco Aurino
O relatório esta gerando vários itens em duplicidade......
Código atual:
SELECT
ALTERACA.QUANTIDADE,
ALTERACA.DATA,
ALTERACA.DESCRICAO,
ALTERACA.UNITARIO,
ALTERACA.TOTAL,
ALTERACA.PEDIDO,
ALTERACA.MEDIDA,
ALTERACA.STATUS,
(SELECT
SUM(ESTOQUE.QTD_ATUAL)
FROM ESTOQUE
WHERE ESTOQUE.CODIGO = ALTERACA.CODIGO) QTD_ATUAL
FROM ALTERACA
WHERE DATA BETWEEN '2014-01-03' AND '2014-01-03';
Codigo que mostra apenas uma descricao e soma todas as suas quantidades:
SELECT DESCRICAO, COUNT (*) total FROM ALTERACA GROUP BY DESCRICAO;
Como faço para o primeiro comando mostrar apenas uma descrição dos itens e somar sua quantidade?
Gostei + 0
05/03/2014
Francisco Aurino
Olha ai um exemplo do meu problema atual:
[img:descricao=Exemplo do Problema Atual - Mesmo Item várias vezes...]http://arquivo.devmedia.com.br/forum/imagem/339657-20140305-215044.png[/img]
Pode ajudar?!
Gostei + 0
06/03/2014
Alex Lekao
basta adicionar a clausula group by ao seu primeiro select e informa os campos que nao sao calculados, somados, contados, etc.
Segue:
SELECT ALTERACA.QUANTIDADE, ALTERACA.DATA, ALTERACA.DESCRICAO, ALTERACA.UNITARIO, ALTERACA.TOTAL, ALTERACA.PEDIDO, ALTERACA.MEDIDA, ALTERACA.STATUS, (SELECT SUM(ESTOQUE.QTD_ATUAL) FROM ESTOQUE WHERE ESTOQUE.CODIGO = ALTERACA.CODIGO) QTD_ATUAL FROM ALTERACA WHERE DATA BETWEEN '2014-01-03' AND '2014-01-03'; GROUP BY ALTERACA.QUANTIDADE, ALTERACA.DATA, ALTERACA.DESCRICAO,ALTERACA.UNITARIO,ALTERACA.TOTAL,ALTERACA.PEDIDO,ALTERACA.MEDIDA,ALTERACA.STATUS,
se esse script que vc informou eh a copia do relatorio, possivelmente ele ficara corrigido com o Group By.
Faz um teste e posta ai se resolveu.
Abraco.
Alex - Lekao
Gostei + 1
06/03/2014
Francisco Aurino
Executei o comando script e apresentou esse erro:
[img:descricao=ERRO AO EXECUTAR]http://arquivo.devmedia.com.br/forum/imagem/339657-20140306-175957.jpg[/img]
SCRIPT EXECUTADO:
ELECT ALTERACA.QUANTIDADE, ALTERACA.DATA, ALTERACA.DESCRICAO, ALTERACA.UNITARIO, ALTERACA.TOTAL, ALTERACA.PEDIDO, ALTERACA.MEDIDA, ALTERACA.STATUS, (SELECT SUM(ESTOQUE.QTD_ATUAL) FROM ESTOQUE WHERE ESTOQUE.CODIGO = ALTERACA.CODIGO) QTD_ATUAL FROM ALTERACA WHERE DATA BETWEEN '2014-01-03' AND '2014-01-03' GROUP BY ALTERACA.QUANTIDADE, ALTERACA.DATA, ALTERACA.DESCRICAO, ALTERACA.UNITARIO, ALTERACA.TOTAL, ALTERACA.PEDIDO, ALTERACA.MEDIDA, ALTERACA.STATUS;
Gostei + 0
10/03/2014
Alex Lekao
Essa mensagem de erro eh apresentada porque esta faltando relacionar algum item no group by.
Experimenta o seguinte e ve se funciona.
SELECT ALTERACA.QUANTIDADE, ALTERACA.DATA, ALTERACA.DESCRICAO, ALTERACA.UNITARIO, ALTERACA.TOTAL, ALTERACA.PEDIDO, ALTERACA.MEDIDA, ALTERACA.STATUS, (SELECT SUM(ESTOQUE.QTD_ATUAL) FROM ESTOQUE WHERE ESTOQUE.CODIGO = ALTERACA.CODIGO GROUP BY ESTOQUE.CODIGO) QTD_ATUAL FROM ALTERACA WHERE DATA BETWEEN '2014-01-03' AND '2014-01-03' GROUP BY ALTERACA.QUANTIDADE, ALTERACA.DATA, ALTERACA.DESCRICAO, ALTERACA.UNITARIO, ALTERACA.TOTAL, ALTERACA.PEDIDO, ALTERACA.MEDIDA, ALTERACA.STATUS;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)