Funções de agregação (count, sum, max, min, avg, median, first, last, partition by)
Confira algumas funções que ajudam nas consultas, onde é necessário criar agrupamentos de diferentes formas.
TABELA EXEMPLO
EX_ITENS
| CODIGO | DESCRICAO | TIPO | QUANTIDADE |
---------------------------------------------------
| 1 | 'Biscoito' | 'Comida' | 20 |
| 2 | 'Água' | 'Bebida' | 47,95 |
| 3 | 'Suco' | 'Bebida' | 23,4 |
| 4 | 'Pão' | 'Comida' | 10 |
| 5 | 'Refrigerante' | 'Bebida' | 13,75 |
SQL de CRIAÇÃO/INSERÇÃO:
CREATE TABLE ex_itens (
codigo INTEGER,
descricao VARCHAR2(200),
tipo VARCHAR(20),
quantidade DECIMAL(15,2));
INSERT INTO ex_itens VALUES (1, 'Biscoito', 'Comida', 20);
INSERT INTO ex_itens VALUES (2, 'Água', 'Bebida', 47.95);
INSERT INTO ex_itens VALUES (3, 'Suco', 'Bebida', 23.4);
INSERT INTO ex_itens VALUES (4, 'Pão', 'Comida', 10);
INSERT INTO ex_itens VALUES (5, 'Refrigerante', 'Bebida', 13.75);
COMMIT;
Consulta com agrupamento agregado
SELECT COUNT(QUANTIDADE) QTD_POR_TIPO,
SUM(QUANTIDADE) VOLUME_POR_TIPO,
MAX(DESCRICAO) KEEP (DENSE_RANK FIRST ORDER BY QUANTIDADE) ITEM_MENOR_QTD_POR_TIPO,
MIN(QUANTIDADE) MENOR_QTD_POR_TIPO,
MAX(DESCRICAO) KEEP (DENSE_RANK LAST ORDER BY QUANTIDADE) ITEM_MAIOR_QTD_POR_TIPO,
MAX(QUANTIDADE) MAIOR_QTD_POR_TIPO,
TRUNC(AVG(QUANTIDADE), 2) MEDIA_QTD_POR_TIPO,
MEDIAN(QUANTIDADE) MEDIANA_QTD_POR_TIPO
FROM EX_ITENS
GROUP BY TIPO
Retorno:
| QTD_POR_TIPO | VOLUME_POR_TIPO | ITEM_MENOR_QTD_POR_TIPO | MENOR_QTD_POR_TIPO | ITEM_MAIOR_QTD_POR_TIPO | MAIOR_QTD_POR_TIPO | MEDIA_QTD_POR_TIPO | MEDIANA_QTD_POR_TIPO |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 3 | 85.1 | 'Refrigerante' | 13.75 | 'Água' | 47.95 | 28.36 | 23.4 |
| 2 | 30 | 'Pão' | 10 | 'Biscoito' | 20 | 15 | 15 |
- Count: Retorna quantidade de linhas no agrupamento definido;
- Sum: Retorna soma de uma coluna das linhas no agrupamento definido;
- Max: Retorna valor máximo do campo de entrada no agrupamento definido;
- Min: Retorna valor mínimo do campo de entrada no agrupamento definido;
- First: Retorna primeiro resultado pela ordenação definida, utilizando estrutura com Keep e Dense_rank;
- Last: Retorna último resultado pela ordenação definida, utilizando estrutura com Keep e Dense_rank;
- Avg: Retorna média dos valores do campo de entrada no agrupamento definido;
- Median: Retorna mediana dos valores do campo de entrada no agrupamento definido.
Consulta com agrupamento analítico
SELECT CODIGO, DESCRICAO, TIPO, QUANTIDADE,
DENSE_RANK() OVER (ORDER BY QUANTIDADE DESC) RANK_QTD,
DENSE_RANK() OVER (PARTITION BY TIPO ORDER BY QUANTIDADE DESC) RANK_QTD_POR_TIPO,
COUNT(QUANTIDADE) OVER (PARTITION BY TIPO) QTD_ITENS_POR_TIPO,
SUM(QUANTIDADE) OVER (PARTITION BY TIPO) QTD_VOLUME_POR_TIPO,
MAX(DESCRICAO) KEEP (DENSE_RANK FIRST ORDER BY QUANTIDADE) OVER (PARTITION BY TIPO) AS ITEM_MENOR_QTD_POR_TIPO,
MIN(QUANTIDADE) OVER (PARTITION BY TIPO) MENOR_QTD_POR_TIPO,
MAX(DESCRICAO) KEEP (DENSE_RANK LAST ORDER BY QUANTIDADE) OVER (PARTITION BY TIPO) AS ITEM_MAIOR_QTD_POR_TIPO,
MAX(QUANTIDADE) OVER (PARTITION BY TIPO) MAIOR_QTD_POR_TIPO,
TRUNC(AVG(QUANTIDADE) OVER (PARTITION BY TIPO), 2) MEDIA_QTD_POR_TIPO,
MEDIAN(QUANTIDADE) OVER (PARTITION BY TIPO) MEDIANA_QTD_POR_TIPO
FROM EX_ITENS
Retorno:
| CODIGO | DESCRICAO | TIPO | QUANTIDADE | RANK_QTD | RANK_QTD_POR_TIPO | QTD_ITENS_POR_TIPO | QTD_VOLUME_POR_TIPO | ITEM_MENOR_QTD_POR_TIPO | MENOR_QTD_POR_TIPO | ITEM_MAIOR_QTD_POR_TIPO | MAIOR_QTD_POR_TIPO | MEDIA_QTD_POR_TIPO | MEDIANA_QTD_POR_TIPO |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 2 | 'Água' | 'Bebida' | 47.95 | 1 | 1 | 3 | 85.1 | 'Refrigerante' | 13.75 | 'Água' | 47.95 | 28.36 | 23.4 |
| 3 | 'Suco' | 'Bebida' | 23.4 | 2 | 2 | 3 | 85.1 | 'Refrigerante' | 13.75 | 'Água' | 47.95 | 28.36 | 23.4 |
| 1 | 'Biscoito' | 'Comida' | 20 | 3 | 1 | 2 | 30 | 'Pão' | 10 | 'Biscoito' | 20 | 15 | 15 |
| 5 | 'Refrigerante' | 'Bebida' | 13.75 | 4 | 3 | 3 | 85.1 | 'Refrigerante' | 13.75 | 'Água' | 47.95 | 28.36 | 23.4 |
| 4 | 'Pão' | 'Comida' | 10 | 5 | 2 | 2 | 30 | 'Pão' | 10 | 'Biscoito' | 20 | 15 | 15 |
- Dense_rank(): Retorna posição de rank definida pela ordenação na estrutura com Over;
- Partition by: Utilizado para retornar um valor agrupado sem fazer um distinct.