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

Duvida ORDER e GROUP

SELECT NOME, CASE WHEN YEAR (DATA_DE_NASCIMENTO )  < 1990 THEN "VELHOS" WHEN YEAR (DATA_DE_NASCIMENTO) > 1990 AND YEAR(DATA_DE_NASCIMENTO) < 1995 THEN "JOVENS" ELSE "CRIANCAS" END AS 'CLASSIFICACAO' FROM TABELA_DE_CLIENTES GROUP BY CLASSIFICACAO;
SELECT NOME, CASE WHEN YEAR (DATA_DE_NASCIMENTO )  < 1990 THEN "VELHOS" WHEN YEAR (DATA_DE_NASCIMENTO) > 1990 AND YEAR(DATA_DE_NASCIMENTO) < 1995 THEN "JOVENS" ELSE "CRIANCAS" END AS 'CLASSIFICACAO' FROM TABELA_DE_CLIENTES ORDER BY CLASSIFICACAO;

Fiz esses dois códigos para resolver o exercício e entender a diferença das saídas, todavia, nao compreendi ao certo o processamento deles. Pelo que pude averiguar, o GROUP BY pegou o primeiro elemento que aparecia em cada tabela enquanto o ORDER pegou todos os elementos e os ordenou após a classificação. Minha dúvida é: (1)pq o GROUP BY não agrupou os elementos conforme as condições do case que passei e defini como " CLASSIFICACAO" mas, sim, pegou o primeiro elemento somente de cada condição? Entendo que fazer isso possa ser mais demorado, mas não é a ideia de agrupar?; (2) Pq o ORDER BY cria uma ordem dentro dos elementos aparentemente aleatória? Digo, ele não segue a ordem dos elementos conforme estão na tabela e também não segue a ordem alfabética.

Saídas: GROUP BY

+-----------------+---------------+
| NOME            | CLASSIFICACAO |
+-----------------+---------------+
| Érica Carvalho  | CRIANCAS      |
| Eduardo Jorge   | JOVENS        |
| Gabriel Araujo  | VELHOS        |
+-----------------+---------------+

ORDER BY:

+---------------------+---------------+
| NOME                | CLASSIFICACAO |
+---------------------+---------------+
| Érica Carvalho      | CRIANCAS      |
| Fernando Cavalcante | CRIANCAS      |
| César Teixeira      | CRIANCAS      |
| Marcos Nougeuira    | CRIANCAS      |
| Edson Meilelles     | CRIANCAS      |
| Abel Silva          | CRIANCAS      |
| Petra Oliveira      | CRIANCAS      |
| Valdeci da Silva    | CRIANCAS      |
| Marcelo Mattos      | JOVENS        |
| Paulo César Mattos  | JOVENS        |
| Eduardo Jorge       | JOVENS        |
| Fábio Carvalho      | JOVENS        |
| Gabriel Araujo      | VELHOS        |
| Carlos Eduardo      | VELHOS        |
| Walber Lontra       | VELHOS        |
+---------------------+---------------+
2 respostas
solução!

Olá Thales,

Demorei um pouco mais compreendi o que você quer fazer, é o seguinte: (1) O GROUP BY está funcionando corretamente, o objetivo do GROUP BY é agrupar os dados para realizar alguma função, por exemplo, uma função SUM, suponhamos que você queria somar o LIMITE DE CREDITO dos clientes por sua classficação, você conseguir ver a soma dos limites com o seguinte comando:

SELECT NOME, SUM(LIMITE_DE_CREDITO) AS LIMITE_TOTAL_POR_CLASSIFICACAO,
    CASE 
        WHEN YEAR (DATA_DE_NASCIMENTO )  < 1990 THEN "VELHOS" 
        WHEN YEAR (DATA_DE_NASCIMENTO) > 1990 AND YEAR(DATA_DE_NASCIMENTO) < 1995 THEN "JOVENS" 
        ELSE "CRIANCAS" 
    END AS 'CLASSIFICACAO' FROM TABELA_DE_CLIENTES GROUP BY CLASSIFICACAO;

O funcionamento do GROUP BY é para casos assim, onde você agrupa os dados e executa alguma função. Ele não consegue mostrar todos os registros classificados como 'CRIANCAS', agrupados num conjuntos de linhas, ele vai juntar, todos os registros classificados como 'CRIANCAS', a palavra mais fácil para entender o GROUP BY é essa: Juntar, ele vai juntar as ocorrências, e por padrão vai pegar os demais campos do primeiro registro.

(2) Note que o ORDER BY está realizando a ordenação pelo campo que você especificou, e nesse caso é o campo 'CLASSIFICACAO', assim os registros estão ordenados por esse campo de forma alfabética (primeiro 'CRIANCAS', segundo 'JOVENS' e por fim 'VELHOS'). Caso você queira ordenar os resultados de cada classificação você terá que usar o campo NOME no ORDER BY, como no seguinte comando:

SELECT NOME, LIMITE_DE_CREDITO,
    CASE 
        WHEN YEAR (DATA_DE_NASCIMENTO )  < 1990 THEN "VELHOS" 
        WHEN YEAR (DATA_DE_NASCIMENTO) > 1990 AND YEAR(DATA_DE_NASCIMENTO) < 1995 THEN "JOVENS" 
        ELSE "CRIANCAS" 
    END AS 'CLASSIFICACAO' FROM TABELA_DE_CLIENTES ORDER BY CLASSIFICACAO, NOME;

Assim vai encontrar o resultado esperado, primeiros os resultados serão ordenados de forma crescente pelo CLASSIFICACAO, e depois serão ordenados de forma crescente pelo NOME, assim você terá a ordenação dessa forma:

+---------------------+---------------+
| NOME                | CLASSIFICACAO |
+---------------------+---------------+
| Abel Silva          | CRIANCAS      |
| César Teixeira      | CRIANCAS      |
| Edson Meilelles     | CRIANCAS      |
| Érica Carvalho      | CRIANCAS      |
| Fernando Cavalcante | CRIANCAS      |
| Marcos Nougeuira    | CRIANCAS      |
| Petra Oliveira      | CRIANCAS      |
| Valdeci da Silva    | CRIANCAS      |
| Eduardo Jorge       | JOVENS        |
| Fábio Carvalho      | JOVENS        |
| Marcelo Mattos      | JOVENS        |
| Paulo César Mattos  | JOVENS        |
| Carlos Eduardo      | VELHOS        |
| Gabriel Araujo      | VELHOS        |
| Walber Lontra       | VELHOS        |
+---------------------+---------------+

Espero que tenha esclarecido suas dúvidas!

Show! Vlw, entendi sim. (1) Na minha cabeça o GROUP BY deveria separar os grupos, mas entendendo ele como ** juntar** faz mais sentido. (2) Entendi, é, falto pedi pra ordenar por ordem alfabética.