SINTAXE
SELECT SUM(nome_da_coluna) FROM nome_da_tabela;
Para os 6 exemplos abaixo, utilizaremos a tabela "tb_fornecedor". Veja a imagem abaixo:
1º Exemplo
Cenário: um funcionário quer calcular o valor total das despesas de uma empresa.
Solução: o valor das despesas estão armazenados na coluna valor, logo devemos somar os valores desta coluna.
Para calcularmos a soma, executamos a sentença abaixo:
SELECT SUM(valor) FROM tb_fornecedor;
Após a execução, teremos o gasto total com as despesas. Conforme podemos visualizar na imagem abaixo:
O nome da coluna aparece como "sum", mas vamos supor que precisamos que seja exibido "total".
Podemos modificar o nome desta coluna, ou seja, criar um alias (apelido). Colocamos o alias depois do "AS"
SELECT SUM(valor) AS total FROM tb_fornecedor;
Após a execução, o nome da coluna será exibido como "total".
2º Exemplo
Cenário: O funcionário de uma empresa quer calcular o valor total das despesas por seguimento, ou seja:
- Total de gastos com o segmento Papelaria e informática
- Total de gastos com o segmento Marcenaria
- Total de gastos com o segmento Serralheria
- Total de gastos com o segmento Limpeza e higiene
Solução: antes de efetuarmos a soma, devemos agrupar os segmentos que estão armazenados na coluna "segmento". Para agruparmos utilizaremos o " GROUP BY".
Para calcularmos a soma por segmento, executamos a sentença abaixo:
SELECT segmento, SUM(valor) AS total
FROM tb_fornecedor
GROUP BY segmento;
Após a execução, teremos o gasto total com as despesas agrupado por segmento. Conforme podemos visualizar na imagem abaixo:
Para ordenar o total em ordem crescente, ou seja, do valor menor para o maior, deve-se usar "ORDER BY" seguido do nome da coluna, neste caso a coluna ordenada será 'total'.
Para ordenar os valores, utilizamos a sentença abaixo:
segmento,
SUM(valor) AS total
FROM tb_fornecedor
GROUP BY segmento
ORDER BY total;
Após a execução, teremos os valores em ordem crescente. Conforme podemos visualizar na imagem abaixo:
Para ordenar o total em ordem decrescente, ou seja, do maior valor para o menor devemos acrescentar o "DESC " depois do "ORDER BY".
Para ordenar os valores em ordem decrescente, utilizamos a sentença abaixo:
segmento,
SUM(valor) AS total
FROM tb_fornecedor
GROUP BY segmento
ORDER BY total DESC;
Após a execução, teremos os valores em ordem decrescente. Conforme podemos visualizar na imagem abaixo:
3º Exemplo
Cenário: Este cenário é um pouco parecido com o anterior, vamos calcular as despesas por segmento, mas agora considerando a quantidade de produtos.
Observação: perceba que foi incluída a coluna quantidade na tabela "tb_fornecedor".
Solução: dentro da função "SUM" devemos fazer a multiplicação da quantidade pelo valor do produto. Exemplo: gastamos R$ 335,00 com o segmento "Limpeza e higiene", pois compramos
- R$ 15,00 de detergente (3 * 5,00);
- R$ 200,00 de desinfetante (5 * 40,00);
- R$ 120,00 de papel toalha (2 * 60,00);
Para calcularmos a soma por segmento, executamos a sentença abaixo:
SELECT
segmento,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
GROUP BY segmento
ORDER BY total;
Após a execução, teremos os totais por segmento. Conforme podemos visualizar na imagem abaixo:
4º Exemplo
O primeiro passo é saber como extrair o mês e o ano de uma data.
Para extrair o mês e o ano de uma data podemos utilizar as funções "extract" ou "date_part". As duas funções são equivalentes no postgresql.
Para extrair o mês e o ano de uma data podemos utilizar as funções "extract" ou "date_part". As duas funções são equivalentes no postgresql.
Exemplo da utilização de extract:
Exemplo da utilização de date_part:
SELECT
data,
extract(month from data) AS mes,
extract(year from data) AS ano
FROM tb_fornecedor;
Significado:
extract(parte_da_data from nome_da_coluna)
- parte_da_data: podemos passar qual a parte da data que queremos, por exemplo, day para o dia ou year para o ano, entre outros.
- nome_da_coluna: nome da coluna de uma tabela. Neste caso vamos escolher a coluna "data" da tabela "tb_fornecedor".
Exemplo da utilização de date_part:
SELECT
data,
date_part('month', data) AS mes,
date_part('year', data) AS ano
FROM tb_fornecedor;
Significado:
Significado:
- date_part('month', data) : extraia o mês (month, em inglês é mês) da coluna data;
- AS mes: a coluna com o mês se chamará mês (alias);
- date_part('year' , data) : extraia o ano (year, em inglês é ano) da coluna data;
- AS ano: a coluna com o ano se chamará ano (alias);
Agora que já sabemos utilizar as funções "date_part" e "extract", vamos utilizá-las para fazer o calculo das despesas para os meses de setembro, outubro e novembro de 2013.
Utilizando extract:
SELECT
extract(month from data) AS mes,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE extract(year from data) = 2013
GROUP BY mes
ORDER BY mes;
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE extract(year from data) = 2013
GROUP BY mes
ORDER BY mes;
Utilizando date_part:
SELECT
date_part('month', data) AS mes,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE date_part('year', data) = 2013
GROUP BY mes
ORDER BY mes;
Após a execução, teremos o total para cada mês.
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE date_part('year', data) = 2013
GROUP BY mes
ORDER BY mes;
Após a execução, teremos o total para cada mês.
Caso queiramos exibir os meses por extenso, ou seja, setembro, outubro e novembro podemos utilizar a função "to_char" do postgre para formatar a data, conforme podemos verificar nas sentenças abaixo:
Utilizando extract:
SELECT
extract(month FROM data) AS mes_num,
/*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/
to_char(data, 'TMMonth "/" YYYY') AS mes,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE extract(year FROM data) = 2013
GROUP BY mes_num, mes
ORDER BY mes_num;
Utilizando date_part:
SELECT
date_part('month', data) AS mes_num,
/*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/
to_char(data, 'TMMonth "/" YYYY') AS mes,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE date_part('year', data) = 2013
GROUP BY mes_num, mes
ORDER BY mes_num;
Após a execução, o mês será exibido por extenso. Conforme podemos visualizar na imagem abaixo:
5º Exemplo
Cenário: Vamos calcular o total das despesas por mês e por segmento. Para isso vamos agrupar por mês e segmento, ou seja o "GROUP BY" será acompanhado pelo mês e pelo segmento.
Utilizando extract:
SELECT
Utilizando date_part:
SELECT
Após a execução, as despesas serão agrupadas por mês e segmento. Conforme podemos visualizar na imagem abaixo:
Utilizando extract:
SELECT
extract(month FROM data) AS mes,
segmento,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE extract(year FROM data) = 2013
GROUP BY mes, segmento
ORDER BY mes, segmento;
SELECT
date_part('month', data) AS mes,
segmento,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE date_part('year', data) = 2013
GROUP BY mes, segmento
ORDER BY mes, segmento;
Após a execução, as despesas serão agrupadas por mês e segmento. Conforme podemos visualizar na imagem abaixo:
Caso queiramos exibir os meses por extenso, ou seja, setembro, outubro e novembro podemos utilizar a função "to_char" na sentença:
Utilizando extract:
SELECT
Utilizando date_part:
Utilizando extract:
SELECT
extract(month FROM data) AS mes_num,
/*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/
to_char(data, 'TMMonth "/" YYYY') AS mes,
segmento,
segmento,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE extract(year FROM data) = 2013
GROUP BY mes_num, mes, segmento
ORDER BY mes_num, segmento;
SELECT
date_part('month', data) AS mes_num,
/*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/
to_char(data, 'TMMonth "/" YYYY') AS mes,
segmento,
segmento,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE date_part('year', data) = 2013
GROUP BY mes_num, mes, segmento
ORDER BY mes_num, segmento;
6º Exemplo
Cenário: queremos saber quais os meses em que as despesas ultrapassaram R$2000, ou seja foram maior que R$2000?
Solução: para sabermos quais os meses em que as despesas ultrapassaram R$2000 vamos adicionar a clausula "HAVING" a sentença.
Utilizando extract:
SELECT
extract(month FROM data) AS mes_num,
/*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/
to_char(data, 'TMMonth "/" YYYY') AS mes,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE extract(year FROM data) = 2013
GROUP BY mes_num, mes
HAVING SUM(quantidade * valor) > 2000
ORDER BY mes_num;
Utilizando date_part:
SELECT
date_part('month', data) AS mes_num,
/*Formata a data em português devido ao prefixo TM. Em caso de dúvida veja o artigo de formatação de data*/
to_char(data, 'TMMonth "/" YYYY') AS mes,
SUM(quantidade * valor) AS total
FROM tb_fornecedor
WHERE date_part('year', data) = 2013
GROUP BY mes_num, mes
HAVING SUM(quantidade * valor) > 2000
ORDER BY mes_num;
Em breve, postarei mais exemplos da função sum.
Ba muito bom, vou indicar para meus colegas da faculdade. Muito obrigado.
ResponderExcluirFico feliz por ter gostado e por compartilhar com seus colegas. Abraço.
ExcluirEstou com um problema, um professor passou um trabalho que ele quer que façamos um bd
ResponderExcluir- cadastre um produto e seu valor(tabela1)
- cadastre itens de venda, ids necessarios e valores totais(tabela2)
- cadastre venda, com o id e total da venda(tabela3) e deve ser atualizado toda vez que for colocado um novo item.
E onde está tendo problemas?
ExcluirEstou com problemas quando tento fazer uma consulta da soma de uma atributo, não sei se é por causa da versão??
ResponderExcluirVocê pode enviar a consulta que está executando e está retornando erro.
Excluircomo faço para obter a soma das entradas de um produto
ResponderExcluir