Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal. Bom dia...
Preciso somar campos de uma tabela, mas de acordo com critérios que estão na base de dados
Lá tenho lançado valores como segue.
MES - ANO - ITEM - VALOR
O campo mes vai de Janeiro a dezembro, setados em Combobox
O campo ANO, ITEM selecionados tb em ComboBox e Valor preenchido em campo Edit
Agora é o problema.
Preciso filtrar a soma de acordo com o MES, ANO e ITEM e somar seus valores que estão nos campos Edit
Por exemplo.
Somar todos os Valores, de acordo com o MES, ANO e ITEM (farmácia ou mercado) por exemplo e colocar em uma var.
O Combobox ITEM, assim como mes de 30 dias e Ano de 2019 à 20xx, tem itens, como Farmacia, mercado, medico, dentista, exames, etc
Alguma santa alma poderia dar uma ajuda?
Olá Mota, Te agradeço muito as dicas. Os campos no BDE estão em formato string. Para somar, deveriam estar em float. Ai essa rotina ficaria bem diferente não?
Segundo o exemplo abaixo, a minha deveria ficar assim (acho)
SELECT Tipo, Fabricante, SUM(Quantidade) AS 'Quantidade em Estoque'
FROM Produtos
GROUP BY Tipo, Fabricante
***************************************************************************
Select Mes, Ano, Item, sum(valor)as 'aqui não sei o que colocaria'
From Nome do Banco
Group By Tipo,ItemTente com CAST , nas procure manter "types" corretos na tabela.
Ola Mota... Eu sou novato nisso.
Alguns comandos soam estranhos para mim e gostaria de entende-los melhor.
NA Tabela vou ter meses de janeiro a dezembro em MES,
Em ANO vou ter ANOS de 2019, 2020, 2021, etc
No campo Item vou ter PrestCasa, Iptu, Alimento, Agua, Gas, Farmácia, etc
Se eu crial duas SQLs, uma filtra todos os campos que obedeças aos critérios acima, tudo no MES e ANO de Farmácia, por exemplo
A outra converte e soma os valores de cada item e o total de cada mes, dentro de determinado ano.
Minha cabeça está dado um nó.
Fiz no Excel, mas fica muito ruim de organizar.
Acredito que seu frontend ( a "tela") esteja em php ,que eu não conheço.
Tente montar o comando sql , inicialnente com dados fixos.
Olá Mota....Ainda tomando uma surra. Coisas simples, até sai
Mas essa somatória por critérios está matando.
Veja abaixo
Tenho uma tabela no Firebird (chars) com os itens: mes, ano, item, valor
Através de campos edit, coloco o mes, ano e item (farmácia, mercado,por exemplo) e ele apresenta a soma do mes ano do item informado. Uso Delphi7 e Firebird.
Filtro com varios ítens já busquei em todos os cantos e não encontrei nada parecido.
Em montei um Locate com vários campos (arrays) para ler o banco do começo ao fim
Assim. Vai pro começo da tabela e roda esse locate dentro de um While.
Encontra o campo que prenche os requisitos dos edits e pega o valor e coloca em uma var (strtofloat)
Vai pro proximo registro e le. Se encontrar todos os requisitos, soma a essa var, senão vai pro proximo. (next)
Mas não roda... fica pulando do while para o locate e não finaliza a rotina. Deveria ir até o fim essa procedure,mas não sei o que está errado.
Comece lendo isto.
device
Eu recomendo você a tentar fazer tudo o mais simples possível, você é iniciante certo? Então evide pular etapas, evite tentar fazer coisas simples mas que são muitas linhas de código do que fazer algo complexo com poucas linhas de código.
Mas assim, se você tem uma tabela com ANO, MÊS, ITEM, VALOR, e você precisa saber o total em valor de 1 item vendido em um periodo (MÊS / ANO); você pode fazer por etapas, digamos que você tem uma tela e ira "informar" via tela (aplicação) algum destes campos como critério, okay?
Então
TELA DE PESQUISA
Mês/Ano Item Valor
[ ]/[ ] [ ]V R$ [ ]
Agora vamos ao que você quer?
Pesquisar por (Relatório) sejá lá o nome que você quer dar para o resultado.
Mês/Ano Item Valor
[ 01 ]/[ 19 ] [ Item 1 ]V R$ [ ]
Você quer uma lista com todos os itens assim:
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
Ou você quer uma lista assim:
01/19 - Item 1 - R$ 9,00
Para o primeiro exemplo eu apenas faço um select simples colocando no meu WHERE os valores informados
MÊS/ANO ITEM e terei a lista retornada, acredito que isso você tenha conseguido realizar.
***select mes, ano, item, valor ftom sua_tabela where mes = "variavel_mes" and ano = "variavel_ano" and item = "varivavel_item".***
Agora se eu quiser o segundo exemplo faço um ***SELECT*** com ***SUM(VALOR)*** colocando os critérios de ***WHERE*** e posso agrupar por algum dos campos como por exemplo ***ITEM*** pois se eu não informar o item na tela eu tenho que tratar a somatória do campo ***VALOR*** para todos os itens
01/19 - Item 1 - R$ 9,00
01/19 - Item 2 - R$ 20,00
01/19 - Item 3 - R$ 1385,15
01/19 - Item 4 - R$ 0,91
***select mes, ano, item, SUM(valor) from sua_tabela where mes = "variavel_mes" and ano = "variavel_ano" and item = "varivavel_item" group by item;***
Agora o que pode estar acontecendo é que no seu comando ***SQL*** você tenha nos seus ***WHERE's*** o parametro de igualdade, mas na sua tela você não informe, eu recomendo você a usar o comando ***LIKE*** *"%SuaVariavel%"* ou se não realizar varios ***OR*** caso um campo não venha preenchido.
***select * from sua_tabela where mes like "%variavel_mes%" and ano like "%variavel_ano%" and item like "%variavel_item%" group by item;***
Com o comando*** LIKE "%%"*** ele busca tudo que contenha o valor interno digitado e caso venha em branco ele traz tudo, isso ira acontecer caso você não preencha o campo do filtro ou passe vazio em seu conteudo, sua "variavel_item" estara com o conteúdo vazio, logo o comando ***LIKE*** fica ***"% variavel_item(que está vazia) %" ***tornando o resultado ***LIKE "%%"***.
Agora caso queira usar o comando ***WHERE*** com ***OR*** recomendo fazer assim:
***select * from sua_tabela where (mes = "variavel_mes" and ano = "variavel_ano" and item ="variavel_item" ) OR (mes = "variavel_mes" and ano = "variavel_ano") OR (mes = "variavel_mes" and item ="variavel_item" ) OR (ano = "variavel_ano" and item ="variavel_item" ) OR (mes = "variavel_mes") OR (ano = "variavel_ano") OR (item ="variavel_item" ) group by item***
Caso tenha alguma dúvida experimente fazer os comandos de **SELECT** dentro do seu Firebird (Banco de Dados) e veja os resultados, faça testes e brinque com os comandos para achar o que realmente você precisa.
Vou deixar uma image de um banco de teste exemplo que tenho e com o select com GROUP BY e SUM de valores
Minha TABELA (exemplo);
/monthly_2019_08/image.png.29ae5ddf9a0db77004a3bbf78bf7034c.png" />
Quero realizar um ***SUM*** pelos campos de ***valores*** e ***quantidade*** ***agrupado*** por ***TP_PRODUTO***
[SELECT](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fselect.html&token=c49e5a3c45ceee4a5813b0738d0ce5e3) tp_produto, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( qtd_peso_sujo ) AS peso, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( vlr_pago ) AS pago, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( vlr_total ) AS totalFROM db_pescado_gelo.sqltb_compraGROUP BY tp_produto
RESULTADO:
/monthly_2019_08/image.png.6b1fab1cbf4670d1c64ecd1b13622774.png" />
Agora quero ***FILTRAR*** por ***TP_PRODUTO*** = ***CAMARÃO***
[SELECT](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fselect.html&token=c49e5a3c45ceee4a5813b0738d0ce5e3) tp_produto, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( qtd_peso_sujo ) AS peso, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( vlr_pago ) AS pago, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( vlr_total ) AS totalFROM db_pescado_gelo.sqltb_compraWHERE tp_produto = "Camarão" -- minha_variavel_tipo_de_produto passada pela aplicaçãoGROUP BY tp_produto
RESULTADO:
/monthly_2019_08/image.png.4f38993b3c2c8384b98db52389739d1f.png" />
Usando o ***LIKE "%%"***
/monthly_2019_08/image.png.406b62857192154d826a602ee57ec005.png" />
Colocando ***"CA"*** dentro da minha variável e passasndo para o comando ***LIKE***
/monthly_2019_08/image.png.65d711bc4ace2e8633fe11c4532335fc.png" />
Bom é isso, acho que dentro dos exemplo que lhe passei você deve ter a sua solução, tente rodar as clausulas no seu banco de dados para entender o comportamento e o funcionamento dos comandos.
Se a minha resposta for útil não esqueça de agradecer e votar positivo.
Espero ter ajudado de alguma forma.
Att***Felipe Guedes Coutinho***>
12 horas atrás, Felipe Guedes Coutinho disse:
device
Eu recomendo você a tentar fazer tudo o mais simples possível, você é iniciante certo? Então evide pular etapas, evite tentar fazer coisas simples mas que são muitas linhas de código do que fazer algo complexo com poucas linhas de código.
Mas assim, se você tem uma tabela com ANO, MÊS, ITEM, VALOR, e você precisa saber o total em valor de 1 item vendido em um periodo (MÊS / ANO); você pode fazer por etapas, digamos que você tem uma tela e ira "informar" via tela (aplicação) algum destes campos como critério, okay?
Então
TELA DE PESQUISA
Mês/Ano Item Valor
[ ]/[ ] [ ]V R$ [ ]
Agora vamos ao que você quer?
Pesquisar por (Relatório) sejá lá o nome que você quer dar para o resultado.
Mês/Ano Item Valor
[ 01 ]/[ 19 ] [ Item 1 ]V R$ [ ]
Você quer uma lista com todos os itens assim:
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
01/19 - Item 1 - R$ 1,00
Ou você quer uma lista assim:
01/19 - Item 1 - R$ 9,00
Para o primeiro exemplo eu apenas faço um select simples colocando no meu WHERE os valores informados
MÊS/ANO ITEM e terei a lista retornada, acredito que isso você tenha conseguido realizar.
***select mes, ano, item, valor ftom sua_tabela where mes = "variavel_mes" and ano = "variavel_ano" and item = "varivavel_item".***
Agora se eu quiser o segundo exemplo faço um ***SELECT*** com ***SUM(VALOR)*** colocando os critérios de ***WHERE*** e posso agrupar por algum dos campos como por exemplo ***ITEM*** pois se eu não informar o item na tela eu tenho que tratar a somatória do campo ***VALOR*** para todos os itens
01/19 - Item 1 - R$ 9,00
01/19 - Item 2 - R$ 20,00
01/19 - Item 3 - R$ 1385,15
01/19 - Item 4 - R$ 0,91
***select mes, ano, item, SUM(valor) from sua_tabela where mes = "variavel_mes" and ano = "variavel_ano" and item = "varivavel_item" group by item;***
Agora o que pode estar acontecendo é que no seu comando ***SQL*** você tenha nos seus ***WHERE's*** o parametro de igualdade, mas na sua tela você não informe, eu recomendo você a usar o comando ***LIKE*** *"%SuaVariavel%"* ou se não realizar varios ***OR*** caso um campo não venha preenchido.
***select * from sua_tabela where mes like "%variavel_mes%" and ano like "%variavel_ano%" and item like "%variavel_item%" group by item;***
Com o comando*** LIKE "%%"*** ele busca tudo que contenha o valor interno digitado e caso venha em branco ele traz tudo, isso ira acontecer caso você não preencha o campo do filtro ou passe vazio em seu conteudo, sua "variavel_item" estara com o conteúdo vazio, logo o comando ***LIKE*** fica ***"% variavel_item(que está vazia) %" ***tornando o resultado ***LIKE "%%"***.
Agora caso queira usar o comando ***WHERE*** com ***OR*** recomendo fazer assim:
***select * from sua_tabela where (mes = "variavel_mes" and ano = "variavel_ano" and item ="variavel_item" ) OR (mes = "variavel_mes" and ano = "variavel_ano") OR (mes = "variavel_mes" and item ="variavel_item" ) OR (ano = "variavel_ano" and item ="variavel_item" ) OR (mes = "variavel_mes") OR (ano = "variavel_ano") OR (item ="variavel_item" ) group by item***
Caso tenha alguma dúvida experimente fazer os comandos de **SELECT** dentro do seu Firebird (Banco de Dados) e veja os resultados, faça testes e brinque com os comandos para achar o que realmente você precisa.
Vou deixar uma image de um banco de teste exemplo que tenho e com o select com GROUP BY e SUM de valores
Minha TABELA (exemplo);

Quero realizar um ***SUM*** pelos campos de ***valores*** e ***quantidade*** ***agrupado*** por ***TP_PRODUTO***
[SELECT](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fselect.html&token=c49e5a3c45ceee4a5813b0738d0ce5e3) tp_produto, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( qtd_peso_sujo ) AS peso, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( vlr_pago ) AS pago, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( vlr_total ) AS totalFROM db_pescado_gelo.sqltb_compraGROUP BY tp_produto
RESULTADO:

Agora quero ***FILTRAR*** por ***TP_PRODUTO*** = ***CAMARÃO***
[SELECT](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fselect.html&token=c49e5a3c45ceee4a5813b0738d0ce5e3) tp_produto, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( qtd_peso_sujo ) AS peso, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( vlr_pago ) AS pago, [SUM](http://localhost:8080/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.6%2Fen%2Fgroup-by-functions.html%23function_sum&token=c49e5a3c45ceee4a5813b0738d0ce5e3)( vlr_total ) AS totalFROM db_pescado_gelo.sqltb_compraWHERE tp_produto = "Camarão" -- minha_variavel_tipo_de_produto passada pela aplicaçãoGROUP BY tp_produto
RESULTADO:

Usando o ***LIKE "%%"***

Colocando ***"CA"*** dentro da minha variável e passasndo para o comando ***LIKE***

Bom é isso, acho que dentro dos exemplo que lhe passei você deve ter a sua solução, tente rodar as clausulas no seu banco de dados para entender o comportamento e o funcionamento dos comandos.
Se a minha resposta for útil não esqueça de agradecer e votar positivo.
Espero ter ajudado de alguma forma.
Att***Felipe Guedes Coutinho***
Obrigado Felipe... Foi esclarecedor....É verdade... sou novato mesmo.
Eu tinha tentato isso abaixo. Deveria funcionar, mas não está indo para o proximo registro.. veja abaixo. Vou seguir seu exemplo, mas so queria entender onde está o erro na procedure abaixo. Veja
procedure somar; //Click Botãobeginvsomavalor:=0; //Zerar VarTableEntradas.Open; // Abrir TabelaTableEntradas.First //ir para o primeiro registrowhile not(TableEntradas.Eof)do //Enquanto não chegar o fim da tabela. fazer...beginif (TableEntradas.locate('MES;ANO;ITEM',VararrayOf([EditMes.Text, EditAno.Text, EditItem.Text]),[]))then //MES, ANO, ITEM, ex:mes 01, ano:2019, Item: Mercado //Na tabela há MES, ANO, ITEM e VALOR.... beginvvalor:=strtofloat(TableEntradas.FiedldByname('VALOR').Asstring; //Se achar o registro, coloca o valor em vValorvsomaValor:=vsomaValor+Vvalor; Vai somando todos os regiostros do MES e ANO (ex 01/2019) com ITEM "Mercado" e pega o campo VALOR desse registroTableEntradas.Next; //......Não está indo para o registro seguinte pra ver se acha o mesmo Item e soma-los
Dá uma lida nisto
https://www.devmedia.com.br/sql-funcoes-de-agregacao/38463
https://www.devmedia.com.br/exemplos-com-group-by-e-com-a-clausula-having-totalizando-dados-sql-server-2008-parte-2/19839
Mas creio que sua dúvida seja mais no PHP.