#FUNÇÕES DE AGREGAÇÃO E AGRUPAMENTO

#funções de agregação (max, sum, min, count, avg) fazem operaçoes na colunas
#por exemplo: sum faz a soma de todos os valores de uma coluna
#cuida, um valor inconsistente em um coluna pode comprometer o resultado

#retorna o produto com maior preco de venda 
SELECT MAX(preco_venda) FROM produto;

#retorna quantos produtos possuem preco venda maior que 100
SELECT COUNT(id_produto) FROM produto WHERE preco_venda>=100;

#retorna quantos produtos da categoria monitores existe no estoque
SELECT categoria.descricao, SUM(produto.quantidade) AS Total_Estoque 
FROM produto JOIN categoria USING(id_categoria) WHERE categoria.descricao="Monitores";

#é possível fazer operações dentro das funções de agregação
#no caso multiplicamos quantidade por valor do produto para clacular valor do estoque
SELECT SUM(quantidade*preco_compra) AS Valor_Estoque FROM produto;

#FUNÇÕES DE AGRUPAMENTO

#group by agrupa colunas com o mesmo valor e permite que operações de agregação sejam realizadas
#por exemplo, contar quantos funcionários que cada departamento possui

#o exemplo abaixo mostra quantos funcionarios temos em cada departamento
SELECT departamento.nome, COUNT(*) AS 'Número de Funcionários' FROM  
funcionario JOIN departamento USING(id_departamento) GROUP BY (id_departamento);

#retorna o valor de estoquer e quantidade de estoque por categoria de produto 
SELECT categoria.descricao, SUM(preco_custo*quantidade), SUM(quantidade) 
FROM produto JOIN categoria USING(id_categoria) GROUP BY (produto.id_categoria)
 ORDER BY categoria.descricao;

# retorna o total da folha de pagamento (soma dos salários de todos os funcionários)
# e a quantidade de funcionários do departamento de Vendas 
SELECT id_departamento, departamento.nome, SUM(salario_fixo) AS 'Folha de Pagamento',
 COUNT(*) AS 'Total de Funcionários' FROM funcionario JOIN departamento USING(id_departamento)
 WHERE departamento.nome='Vendas' GROUP BY (funcionario.id_departamento);
 
#retorna o total vendido por cada funcionário no ano de 2017
SELECT nome, sum(total) AS 'Total Vendas' FROM funcionario JOIN pedido USING(id_funcionario) 
WHERE YEAR(data)=2017 GROUP BY(id_funcionario) ORDER BY SUM(total);