Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Usando AS e Order By

Tenho praticado o uso do AS e Order By em query's maiores justamente para entender mais sobre ordem de precedência dos comandos SQL, no código abaixo eu consegui ordenar de forma descendeste os Nomes dos Produtos, porém , não consigo ordenar as Médias de Valores, grato pela ajuda

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 as Classificação_Preço , 
AVG([PREÇO DE LISTA]) as Média_Valores
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  order by [NOME DO PRODUTO] desc, order by [PREÇO DE LISTA] desc
3 respostas

Boa tarde Marcus, tudo bem?

Primeiramente, parabéns pela excelente prática em utilizar nomeação de campos nas suas buscas. Você apenas está enfrentando um erro de sintaxe no seu SQL, tente algo como a seguinte execução:

SELECT
    nome_produto,
    CASE
        WHEN preco_lista >= 12 THEN 'PRODUTO CARO'
        WHEN preco_lista >= 7 AND preco_lista< 12 THEN 'PRODUTO EM CONTA'
        ELSE 'PRODUTO BARATO'
    END AS Classificacao_Preco , 
    AVG(preco_lista) AS Media_Valores
FROM
    tabela_produtos
GROUP BY
    nome_produto
ORDER BY
    nome_produto DESC,
    preco_lista DESC,
    CASE
        WHEN preco_lista >= 12 THEN 'PRODUTO CARO'
        WHEN preco_lista >= 7 AND preco_lista< 12 THEN 'PRODUTO EM CONTA'
        ELSE 'PRODUTO BARATO'
    END DESC

Mais um detalhe que vale ressaltar: ordenar pelo case que retorna uma string significa que o SQL irá ordenar por ordem alfabética, se você busca uma ordenação de valores, utilize o campo "preco_lista" com o seu valor real (seja inteiro ou com ponto flutuante).

Obs: Eu alterei os nomes dos campos para ficar mais fácil de entender.

Espero ter te ajudado, abraço!

solução!

Boa tarde Marcus,

Primeiro vamos entender e avaliar a query:

"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"

Não é necessário repetir o case para agrupar campos, nesse caso você pode simplificar esse código agrupando apenas os campos utilizados no select, da seguinte forma:

"GROUP BY [NOME DO PRODUTO], [PREÇO DE LISTA]"

A questão da ordenação de campos, você vai utilizar o campo do qual quer realizar a ordenação... "order by [NOME DO PRODUTO] desc, order by [PREÇO DA LISTA] desc" ...note que o campo "[PREÇO DA LISTA]", não será um campo de retorno, ele é um campo de variável na estrutura da query, o campo de ordenação desejado é o "AVG([PREÇO DE LISTA]) as Média_Valores". Então use o campo para ordernar: "order by [NOME DO PRODUTO] desc, [Média_Valores] desc;"

A query para a consulta ficará da seguinte forma:

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                        as [Classificação_Preço], 
    AVG([PREÇO DE LISTA])                            as [Média_Valores]

        FROM [TABELA DE PRODUTOS] 

    GROUP BY 
        [NOME DO PRODUTO],
        [PREÇO DE LISTA],

    order by [NOME DO PRODUTO] desc, [Média_Valores] desc;

Espero ter ajudado.

Abraço!!!

Bah brigadão Stefano e Diésnei pela ajuda ai, deu uma boa clareada em como melhorar as minhas consultas. Um detalhe que estou esquecendo de fazer é indentar o código. Vou começar a fazer