Pular para o conteúdo principal

O que devemos conhecer sobre SQL/Oracle Parte 13: Gerando resultados com o agrupamento de dados relacionados


Utilizando a operação ROLLUP para produzir valores subtotais



O ROLLUP é uma subcláusula do GROUP BY, ele realiza agrupamento de dados agrupados, esses registros são conhecidos como superagregados. É normalmente utilizado com SUM, mas nada impede que ele seja utilizado com outras funções de agrupamento. Seu resultado é um registro de sumarização simples para cada agrupamento:



select d.descricao departamento, c.descricao cargo, sum(salario) total
from funcionarios  f
join cargos        c
on c.codigo      = f.cod_cargo
join departamentos d
on d.codigo      = c.cod_dep
group by rollup (d.descricao, c.descricao)
order by d.descricao, c.descricao

No comando acima, além de termos as somas dos salários por cargo, também teremos um total por departamento.

Resumindo:

  • ROLLUP apenas é permitido com a cláusula GROUP BY;
  • ROLLUP calcula subtotais e totais para os grupos de registros;
  • ROLLUP vem após o GROUP BY;
  • Após o ROLLUP vêm os itens do GROUP BY que devem ser agregados;
  • ROLLUP pode possuir mais de uma expressão, separadas por vírgula;


Utilizando a operação CUBE para produzir valores CROSSTABULATIONS


O CUBE assim como o ROLLUP é uma subcláusula do GROUP BY, porém ele é capaz de gerar uma totalização para cada agrupamento encontrado:

select d.descricao departamento, c.descricao cargo, sum(salario) total
from funcionarios  f
join cargos        c
on c.codigo      = f.cod_cargo
join departamentos d
on d.codigo      = c.cod_dep
group by cube (d.descricao, c.descricao)
order by d.descricao, c.descricao

No exemplo acima além de termos as somas dos salários por cargo e o total por departamento, teremos também o total que cada cargo possui.

Resumindo:
  • CUBE só é permitido com GROUP BY;
  • CUBE produz totais e subtotais para todas as combinações possíveis de um agrupamento;
  • CUBE vem após o GROUP BY seguido das expressões entre parênteses;


Utilizando a função GROUPING para identificar registros ROLLUP e CUBE


A função GROUPING retorna um numero, zero ou um, indicando se o registro é agregado (zero), ou superagregado (um):

select grouping(d.descricao), d.descricao departamento, c.descricao cargo, sum(salario) total
from funcionarios  f
join cargos        c
on c.codigo      = f.cod_cargo
join departamentos d
on d.codigo      = c.cod_dep
group by rollup (d.descricao, c.descricao)
order by d.descricao, c.descricao

Resumindo:
  • A função GROUPING identifica registros agrupados, sejam regulares ou superagregados;
  • Registros regulares não são ROLLUP ou CUBE;
  • Superagregados são resultados gerados por ROLLUP ou CUBE;
  • O GROUPING retorna 0 para registros regulares e 1 para superagregados;
  • É possível combinar o GROUPING com outras funções;


Utilizando GROUPING SETS para produzir resultados simplificados


O GROUPING SETS também é uma subcláusula do GROUP BY, ele permite refinar o resultado dos agrupamentos, sendo possível especificar quais grupos desejamos mostrar:

select d.descricao departamento, c.descricao cargo, decode(f.sexo, 'M', 'HOMENS', 'F', 'MULHERES') grupo, sum(salario) total
  from funcionarios  f
  join cargos        c
    on c.codigo      = f.cod_cargo
  join departamentos d
    on d.codigo      = c.cod_dep
 group by grouping sets ((d.descricao, c.descricao), (f.sexo), null)
  order by d.descricao, c.descricao, f.sexo

No exemplo acima definimos que nosso primeiro agrupamento será a combinação ((d.descricao, c.descricao), depois (f.sexo) e por fim o null que indica o total, como resultado teremos um registro para cada combinação definida, incluindo o total.

Resumindo:
  • GROUPING SETS são geralmente utilizados para consultas que geram múltiplos grupos;
  • GROUPING SETS permitem a definição dos grupos a serem recuperados, apenas para os resultados desejados;


Comentários

Mais visitadas

Array no PL/SQL (Oracle)

Trabalhar com estruturas indexadas pode nos poupar muito trabalho, deixar o código mais limpo e reutilizável, pois bem vamos dar um exemplo de como fazer isso no PL/SQL. Criaremos um tipo table que seja capaz de armazenar nomes de uma tabela de funcionários de forma indexada, e em seguida mostraremos o que foi armazenado, segue o código: 1: declare 2: -- tipo tabela contendo apenas texto e indexado 3: type TipoNomFunc is table of varchar 2(200) index by binary_integer; 4: -- variável do nosso tipo (como nosso tipo é indexado ele funcionará como um array) 5: func TipoNomFunc; 6: -- indice para loop 7: indice number := 1; 8: -- 9: begin 10: -- 11: -- cursor para nossa tabela de funcionarios 12: for emps in ( 13: select * 14: from funcionarios 15: ) 16: loop 17: -- colocamos o nome do funcionario em nosso "vetor" 18: func(indice) := emps.nom_funcionario; 19: -- incrementamos o indice 20:...

Criando uma Aplicação CRUD com Flask, PostgreSQL e Docker

Criando uma Aplicação CRUD com Flask, PostgreSQL e Docker Neste guia, vamos criar uma aplicação básica que acessa um banco de dados PostgreSQL e realiza operações CRUD (Create, Read, Update, Delete). Vamos usar Flask e executar tudo com Docker. Sem estilos ou extras, apenas o essencial. Estrutura do Projeto crud-app/ |-- app/ | |-- app.py | |-- templates/ | | |-- index.html | | |-- edit.html |-- Dockerfile |-- requirements.txt |-- docker-compose.yml Passo 1: Dependências Crie um arquivo requirements.txt com as seguintes linhas: Flask==2.2.2 Flask-SQLAlchemy==3.0.2 psycopg2-binary==2.9.3 Werkzeug==2.2.2 Passo 2: Aplicação Flask Arquivo app/app.py : from flask import Flask, render_template, request, redirect, url_for from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # Configuração do banco de dados app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@db:5432/crud_db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db...

Aplicação Flask usando Nginx e Gunicorn

Aplicação Flask usando Nginx e Gunicorn Se você já desenvolveu uma aplicação Flask básica, sabe que o servidor de desenvolvimento embutido não é ideal para produção. Ele não é projetado para lidar com altos volumes de tráfego ou conexões simultâneas. Para tornar sua aplicação Flask mais robusta e pronta para produção, podemos usar o Gunicorn como servidor de aplicação e o Nginx como proxy reverso. Neste artigo, vamos adaptar o exemplo anterior ( Criando uma Aplicação CRUD com Flask, PostgreSQL e Docker ) para incluir o Nginx e o Gunicorn. O que são Nginx e Gunicorn? Gunicorn O Gunicorn (Green Unicorn) é um servidor de aplicação WSGI que roda aplicações Python como o Flask. Ele é eficiente e simples de configurar, lidando com múltiplas requisições ao mesmo tempo, algo que o servidor embutido do Flask não faz bem. Nginx O Nginx é um servidor web que atua como um proxy reverso. Ele recebe requisições HTTP e as encaminha ao Gunicorn. Além disso, o Nginx pode: Servir arquivos ...