Em SQL, usamos o GROUP BY para indicar a coluna ( dimensão ) do
agrupamento, ou seja para
enquanto o FROM é a tabela escolhida, o SELECT é a coluna ou as colunas escolhidas e o WHERE é o filtro por linhas.
Cabe salientart que a ordem como se organiza as colunas na clásula SELECT é a ordem que irá aparecer na tela. Será a mesma ordem apresentada. Por questões de boas práticas se põe na mesma ordem no SELECT e no GROUP BY.
O GROUP BY é um agrupamento por CATEGORIAS (por exemplo você tem definido uma quantidade X de cliente em 3 categorias [gold, premium, basic], o GROUP BY pode organizar por categoria a função agregadora que você escolher tais como média, soma, contagem...).
* * *
Ainda sobro GROUP BY se houve sub categorias você pode adiciona-las, isso causará um efeito GRANULAR e a medida que vai subcategorizando você vai granulando seus dados.
FAIXA ETÁRIA
01 - 15 // 16 - 30 // 31 - 45 // 46 - 60 // 61 - 75 // 76 -100 (Temos 5 faixa etárias)
GENEROS
HOMENS // MULHERES // NÃO BINÁRIO // NÃO DECLARADOS (Temos 4 gêneros)
TIPOS DE GASTOS
ALIMENTAÇÃO // VESTUÁRIO // SAÚDE // EDUCAÇÃO // LAZER (Temos 5 tipos de gastos)
A medida que quero especificar a minha amostra, ou seja dependendo do tamanho do recorte eu vou precisar agrupar mais ou menos inserindo mais ou menos colunas através do GROUP BY.
Por exemplo: As compras de vestuário de uma mulher de 31 - 45, podem ser subcategorizadas por acessórios, por preço, por forma de pagamento.
Colunas apenas com quantidades podem ser agrupadas, mas diferente das colunas de categorias ela não tem o mesmo potencila de informações a oferecer.
Observação importante, se usar determinada coluna no GROUP BY e ela contiver dados com datas, possivelmente será preciso usar o DATE, mas para não haver choques/conflitos será preciso usar o DATE no SELECT também.
Não é possivel agrupar (usar o GROUP BY) com funções agregadoras (SUM // COUNT // AVG // MIN // MAX )
Resumindo:
SELECT (seleciona coluna(s))
FROM (seleciona tabela(s))
WHERE (seleciona linha(s))
GROUP BY (seleciona colunas e organiza por categoria(s)).
Vejamos um exemplo:
FASE 01
SELECT
p.product_category_name
FROM products p
FASE 02
SELECT
p.product_category_name,
COUNT( p.product_id )
FROM products p
SELECT
p.product_category_name,
COUNT( p.product_id ),
MIN( p.product_width_cm )
FROM products p
FASE 04
SELECT
p.product_category_name,
COUNT( p.product_id ),
MIN( p.product_width_cm ),
SUM( p.product_weight_g ),
AVG( p.product_weight_g )
FROM products p
FASE 05 (Precisei renomear para a foto ficar com uma boa qualidade em uma tamanho cada vez maior, ocupando menos espaço nas celulas dos nomes das colunas)
SELECT
p.product_category_name,
COUNT( p.product_id ) as qty_,
MIN( p.product_width_cm ) as min_,
SUM( p.product_weight_g ) as sum_,
AVG( p.product_weight_g ) as aveg_,
MAX( p.product_height_cm ) as max_
FROM products p
SELECT
p.product_category_name,
COUNT( p.product_id ) as qty_,
MIN( p.product_width_cm ) as min_,
SUM( p.product_weight_g ) as sum_,
AVG( p.product_weight_g ) as aveg_,
MAX( p.product_height_cm ) as max_,
COUNT( DISTINCT p.product_length_cm ) as length_
FROM products p
FASE 07 - Resultado final da minha QUERY
SELECT
p.product_category_name,
COUNT( p.product_id ),
SUM( p.product_weight_g ),
AVG( p.product_weight_g ),
MAX( p.product_height_cm ),
MIN( p.product_width_cm ),
COUNT( DISTINCT p.product_length_cm )
FROM products p
GROUP BY p.product_category_name