Oradata

Subtotal no SQL*Plus

Subtotal no SQL*Plus

Olá pessoal, hoje vamos falar um pouco do SQL*Plus e obviamente de SQL (para Oracle é claro).

O SQL*Plus para quem não conhece é uma ferramenta de prompt de comando (similar ao MS-DOS) para interagirmos com o banco de dados através de comandos na linguagem SQL. Se você tem o Oracle instalado em seu computador, seja ele uma base de dados ou um client, o SQL*Plus muito provavelmente deve estar instalado junto.

Para que você acesse o SQL*Plus basta chama-lo via linha de comando digitando “sqlplus” como na imagem abaixo:

01_sqlplus_start

Feito isso ele vai pedir que você digite suas credenciais de acesso, no meu caso vou me conectar a uma instancia de banco de dados chamada DEVDB com o usuário “store” e a senha “store_password”.

02_conectado

Se tudo está OK, e você conseguiu se conectar, a sua última linha então deve ser “SQL>”. Feito isso, agora você pode entrar com seus comandos SQL, esse é apenas um resumo bem rápido do que é o SQL*Plus prometo em breve escrever alguns artigos mais detalhados sobre o tema, agora vamos ao nosso assunto principal, o tal “subtotal”

Muitas vezes, você precisa escrever determinados selects para montar relatórios que contenham subtotais e isso normalmente gera muita confusão na hora da elaboração do comando SQL, caso você vá criar um select para ser executado diretamente no SQL*Plus, é possível encurtarmos este processo haja vista que o SQL*Plus traz alguns comandos que facilitam nossa vida neste quesito.

Nota: Caso seja algum tipo de SQL que você vá embarcar no código de alguma linguagem de programação, este não será o caso, e para isso haverá outras maneiras de gerar este subtotal.

Para fazer o subtotal dentro SQL*Plus, usamos duas palavras chave que são “BREAK ON” e “COMPUTE”, vejamos a explicação de cada uma delas abaixo:

BREAK ON: Força o SQL*Plus a parar o processamento quando o valor de determinada coluna mudar. Para ficar mais claro pense “BREAK ON” = “PARE EM”, ou seja, em uma condição que você especificar (uma coluna de referência) o SQL*Plus vai dar uma “pausa”.

COMPUTE: Vem do verbo “computar” ou seja, até aquele momento que você mandou o SQL*Plus dar uma pausa, na sequencia você tem a oportunidade de computar os dados de determinada coluna e gerar um resultado final.

Agora para ilustrarmos, vamos usar uma tabela de chamada “PRODUCTS” que hipoteticamente possui dados de produtos que estão à venda, sendo assim vamos ter um ID do produto, um nome e um preço, veja a estrutura da tabela abaixo.

03_desc_products

Com base nessa descrição de tabela, imagine que você precisa gerar um relatório que te exiba os produtos separados por categoria, juntos com suas respectivas descrições e valores individuais, mais o subtotal por categoria de produto. Neste caso nossa query ficaria assim:

04_comando_sql

Linha a linha:

1 – set pages 50: Define que a cada 50 linhas exibidas no resultado, o cabeçalho será exibido novamente.

2 – set lines 150: Define que as linhas devem ter 150 posições

3 – set colsep ‘|’: Define que o separador de colunas será o “|” (pipe).

4 – column price format $999.99: Define a coluna price em um formato monetário de até 3 posições “inteiro” e duas casa decimais.

5 – break on product_type_id: O processamento deve ser pausado a cada troca de valor na coluna product_type_id, ou seja, nosso critério de subtotal.

6 – compute sum of price on product_type_id: Complementando o item acima, toda vez que se formar um conjunto de valores iguais na coluna “product_type_id”, será realizada a soma (sum) na coluna “price”, produzindo então o nosso subtotal. Vejamos o resultado final:

05_resultado_final

Interessante não? Vale ressaltar que isso só vale para o SQL*Plus, não tente embarcar este código dentro do código fonte de sua aplicação ou em alguma IDE de conexão com o banco de dados, pois o resultado provavelmente não será o mesmo, nestes casos usaremos outras técnicas que discutiremos em outros artigos.

Uma dica para deixar a “brincadeira” mais interessante, experimente trocar a palavra “sum” por “min”, “max”, “avg” e “count”. Veja o que acontece.

É isso aí, espero ter ajudado, forte abraço e até a próxima.

Douglas Paiva de Sousa

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *