2
respostas

AVG

Acho que me perdi um pouco quando omeçou a ficar mais complexo e misturar tudo rss

Onde o professor explica sobre o uso do AVG?

2 respostas

Fiquei bem confusa com o exemplo, segue...

Usando Condições para Classificar 4:50

SELECT [NOME DO PRODUTO],
CASE WHEN [PREÇO DE LISTA] >= 12 THEN 'PRODUTO CARO'
WHEN [PREÇO DE LISTA] >= 7 AND [PREÇO DE LISTA] < 12 THEN 'PRODUTO EM CONTA'
ELSE 'PRODUTO BARATO' END
FROM[TABELA DE PRODUTOS] order by [nome do produto]

(Ordenei para ver se existia mais de um produto com o mesmo nome)

Então o professor sugere o uso de um Group by para buscar a média, o que não entendi visto que se só existe um produto de cada a média seria do que?

SELECT [NOME DO PRODUTO],
CASE WHEN [PREÇO DE LISTA] >= 12 THEN 'PRODUTO CARO'
WHEN [PREÇO DE LISTA] >= 7 AND [PREÇO DE LISTA] < 12 THEN 'PRODUTO EM CONTA'
ELSE 'PRODUTO BARATO' END,
AVG([PREÇO DE LISTA])
FROM
[TABELA DE PRODUTOS]
GROUP BY [NOME DO PRODUTO],
CASE WHEN [PREÇO DE LISTA] >= 12 THEN 'PRODUTO CARO'
WHEN [PREÇO DE LISTA] >= 7 AND [PREÇO DE LISTA] < 12 THEN 'PRODUTO EM CONTA'
ELSE 'PRODUTO BARATO' END

Se fosse uma média das classificações todas apareceriam iguais, ou seja todo produto barato teria a mesma média o que não acontece...

Clean - 350 ml - Laranja    PRODUTO BARATO    2,808
Clean - 470 ml - Laranja    PRODUTO BARATO    3,768
Festival de Sabores - 700 ml - Maracujá    PRODUTO BARATO    4,912
Frescor do Verão - 350 ml - Manga    PRODUTO BARATO    3,8595
Frescor do Verão - 470 ml - Manga    PRODUTO BARATO    5,1795
Light - 350 ml - Melância    PRODUTO BARATO    4,555
Linha Citros - 700 ml - Lima/Limão    PRODUTO BARATO    4,904
Linha Refrescante - 700 ml - Morango/Limão    PRODUTO BARATO    6,3105
Pedaços de Frutas - 350 ml - Maça    PRODUTO BARATO    4,211
Sabor da Montanha - 700 ml - Uva    PRODUTO BARATO    6,309
Videira do Campo - 350 ml - Melância    PRODUTO BARATO    4,56

Se for a média do produto também não tem logica já que so existe um produto de cada tipo na tabela de produto!

812829    Clean - 350 ml - Laranja    Lata    350 ml    Laranja    2,808
Clean - 470 ml - Laranja    PRODUTO BARATO    3,768

Portanto o Group by não traz uma média e sim o preço do produto...

Queria entender o que o professor quis fazer, acho bem confuso quando não explica antes o que quer fazer...

e mesmo entendendo agora o que trouxe o resultado "média" não entendi o AVG

Olá, Amanda, tudo bem?

Peço desculpas pela demora no retorno.

O instrutor explica sobre as funções de agregação, na atividade 07 Agrupando os resultados

A função de agregação AVG, retorna a média aritmética de um conjunto de valores. A média é obtida somando todos os valores e dividindo o valor encontrado pelo número de dados desse conjunto.

No exemplo utilizado pelo instrutor durante a aula, realmente não faz sentido a utilização do AVG, já que o resultado final não é alterado. Porém, o foco principal da explicação é utilização da instrução CASE quando temos em uma consulta a cláusula group by.

Ao utilizarmos uma função de agregação, normalmente também precisamos informar a cláusula group by, que é utilizada para agrupar registros semelhantes de uma tabela em um ou mais campos. No SQL Server não é permitido realizar consultas onde os campos listados na seleção que não estão em uma função de agregação, não estão informadas na cláusula group by.

Como no exemplo utilizado pelo instrutor, na seleção temos o campo [NOME DO PRODUTO], a instrução CASE e o campoAVG([PREÇO DE LISTA]) que está dentro da função de agregação AVG, neste caso, precisamos informar na cláusula group by, todos os campos que não fazem parte da função de agregação, ou seja, o campo [NOME DO PRODUTO] e a instrução CASE, precisam ser informados na cláusula group by, caso contrário, um erro será retornado:

SELECT [NOME DO PRODUTO],
CASE WHEN [PREÇO DE LISTA] >= 12 THEN 'PRODUTO CARO'
WHEN [PREÇO DE LISTA] >= 7 AND [PREÇO DE LISTA] < 12 THEN 'PRODUTO EM CONTA'
ELSE 'PRODUTO BARATO' END,
AVG([PREÇO DE LISTA])
FROM
[TABELA DE PRODUTOS]
GROUP BY [NOME DO PRODUTO]

Print da tela do SSMS onde o comando SQL anterior está sendo executado e o erro:  `Mensagem 8120, Nível 16, Estado 1, Linha 2
A coluna 'TABELA DE PRODUTOS.PREÇO DE LISTA' é inválida na lista de seleção porque não está contida em uma função de agregação nem na cláusula GROUP BY.` foi retornado, pois a instrução CASE, não foi informada na clausula GROUP BY

Uma forma de aplicar o AVG nesta consulta, é buscar a média de preço dos produtos por classificação, ou seja, será retornado a média aritmética de todos os produtos classificados como barato, de todos os produtos classificados como em conta e de produtos classificados como caro

SELECT 
CASE WHEN [PREÇO DE LISTA] >= 12 THEN 'PRODUTO CARO'
WHEN [PREÇO DE LISTA] >= 7 AND [PREÇO DE LISTA] < 12 THEN 'PRODUTO EM CONTA'
ELSE 'PRODUTO BARATO' END AS 'CLASSIFICAÇÃO',
AVG([PREÇO DE LISTA]) as 'Média'
FROM
[TABELA DE PRODUTOS]
GROUP BY CASE WHEN [PREÇO DE LISTA] >= 12 THEN 'PRODUTO CARO'
WHEN [PREÇO DE LISTA] >= 7 AND [PREÇO DE LISTA] < 12 THEN 'PRODUTO EM CONTA'
ELSE 'PRODUTO BARATO' END

Print da tela do SSMS onde o comando SQL anterior está sendo executado, e o resultado retornado é a média aritmética do preço dos produtos por classificação, produto barato, em conta e caro.

Qualquer nova dúvida é só falar e bons estudos!