Translate

Mostrando postagens com marcador sql. Mostrar todas as postagens
Mostrando postagens com marcador sql. Mostrar todas as postagens

sábado, 29 de novembro de 2014

Postgresql - Função MIN

A função MIN retorna o valor mínimo (menor valor) de uma coluna. 
Serão descritos 3 exemplos de utilização desta função. 

Caso tenha interesse, faça o download ou veja os scripts no github.


SINTAXE
SELECT MIN(nome_da_coluna) FROM nome_da_tabela;

1º Exemplo
 
Neste exemplo, utilizaremos a tabela "tb_imoveis". Veja a imagem abaixo:

tb_imoveis
  

Cenário: qual o imóvel que possui o valor mais baixo?

Solução: o valor dos imóveis estão armazenados na coluna valor, logo devemos calcular o valor mais baixo a partir desta coluna.
Para calcularmos o valor mínimo, executamos a sentença abaixo:

SELECT MIN(valor) FROM tb_imoveis;

Após a execução, teremos o imóvel com o valor mais baixo. Conforme podemos visualizar na imagem a seguir:

O nome da coluna aparece como "min", mas vamos supor que precisamos que seja exibido "imovel_valor_minimo".
Podemos modificar o nome desta coluna, ou seja, criar um alias (apelido). Colocamos o alias depois do "AS
SELECT MIN(valorAS imovel_valor_minimo FROM tb_imoveis;

Após a execução, o nome da coluna será exibido como "imovel_valor_minimo".


2º Exemplo

Cenário: Uma equipe de três atletas treina uma série de corridas. Queremos saber qual foi o melhor treino para cada atleta, ou seja qual corrida levou menos tempo.
Neste exemplo, utilizaremos a tabela "tb_treino".

tb_treino

Solução: já que procuramos o menor tempo por atleta, vamos agrupar os atletas que estão armazenados na coluna "atleta_id". Para agrupar, utilizaremos o " GROUP BY".

Para calcularmos o menor tempo por atleta, executamos a sentença abaixo:

SELECT atleta_id, MIN(tempo) AS melhor_tempo
FROM tb_treino
GROUP BY atleta_id;

Após a execução, teremos o melhor tempo  para cada atleta. Conforme podemos visualizar na imagem abaixo:



Para ordenar a identificação dos atleta em ordem crescente, ou seja, do valor menor para o maior, deve-se usar "ORDER BY" seguido do nome da coluna, neste caso, a coluna 'atleta_idserá ordenada .
Para ordenar as identificações, utilizamos a sentença abaixo:

SELECT atleta_id, 
MIN(tempo) AS pior_tempo
FROM tb_treino
GROUP BY atleta_id
ORDER BY atleta_id;

Após a execução, teremos as identificações dos atletas em ordem crescente. Conforme podemos visualizar na imagem abaixo:




3º Exemplo

Cenário: Qual o atleta que obteve o melhor treino? Qual a data que o treino ocorreu?
Neste exemplo, utilizaremos a tabela "tb_treino".

tb_treino

Solução: também podemos utilizar a função "MIN" para filtrar um registro, desde que a função "MIN" pertença a uma subquery.

    Veja a subquery destacada, em azul, na sentença abaixo:

    SELECT 
    atleta_id,   
    data, 
    tempo AS melhor_tempo
    FROM tb_treino 
    WHERE tempo =
    (
        SELECT MIN(tempo)
        FROM tb_treino
    )

    Após a execução da sentença, teremos o resultado exibido na imagem abaixo:

    Observação:

    A função MIN não funciona no WHERE sem a subquery.

    WHERE tempo = MIN(tempo)

    Deixe o seu comentário ou sugestão.
    Gostou?  Siga no Google +  ou Facebook.

    sábado, 13 de setembro de 2014

    Postgresql - função LPAD

    Neste artigo, vamos mostrar 2 exemplos, da utilização da função LPAD.
     
    Utilizamos a função LPAD para completar uma string do lado esquerdo com determinado(s) caractere(s).

    O script dos exemplos, também estão no GitHub.

    SINTAXE

    LPAD (string, posicao_de_caracteres, 'caracter_para_preechimento')
    • string: sequëncia de caracteres;  
    • posicao_de_caracteres: indica até que posição a string será preenchida;
    • caracter_para_preechimento: caractere(s) utilizado(s) para o preenchimento, estes caracteres devem estar entre aspas;
    1º Exemplo

    Completar com o hifen (-) a esquerda dos nomes dos produtos até a 10ª posição.  
    Neste exemplo, vamos utilizar a coluna "nome_produto" tabela "tb_produto", exibida na imagem abaixo.
    tb_produto
    Solução

    SELECT
    nome_produto,
    LPAD (nome_produto,10, '-') AS nome_produto_com_hifen
    FROM tb_produto;

    Após a execução da sentença, teremos o seguinte resultado:

    Observações
    • lápis:        tem 5  caracteres e foi preenchida com 5 caracteres para completar as 10 posições;
    • caderno:  tem 7  caracteres e foi preenchida com 3 caracteres para completar as 10 posições;
    • borracha: tem 8 caracteres e foi preenchida com 2 caracteres para completar as 10 posições;
    • cartolina: tem 9 caracteres e foi preenchida com 1 caractere  para completar as  10 posições;
    No lugar do hífen (-), poderiamos utilizar qualquer outro caractere alfanumérico ou caractere especial.
    Por exemplo: uma ou mais letras, dígitos, espaços, asterisco entre outros.
      
    2º Exemplo

    Preencher com zeros "0" a esquerda, até a 5ª posição, os códigos dos produtos.
    Neste exemplo, vamos utilizar a coluna "codigo_produto" tabela "tb_produto", exibida na imagem abaixo.

    tb_produto

    Solução

    Como a função LPAD completa uma string, antes de utilizarmos a função LPAD, neste exemplo, devemos utilizar a função CAST para converter a coluna codigo_produto que é do tipo integer (número inteiro) para string (CHARACTER VARYING ou VARCHAR como é mais conhecido).

    SELECT
    LPAD (CAST(codigo_produto AS VARCHAR), 5, '0') AS codigo_produto, 
    nome_produto
    FROM tb_produto;

    Após a execução da sentença, teremos o seguinte resultado:


    Observações
    • O número   8426 tem   4 dígitos, e foi preenchido com 1 zero  para completar 5 dígitos;
    • O número     438 tem   3 dígitos, e foi preenchido com 2 zeros para completar 5 dígitos;  
    • O número       22 tem   2 dígitos, e foi preenchido com 3 zeros para completar 5 dígitos;
    • O número 16547 tem   5 dígitos, logo não foi preenchido com zeros, pois já contém 5 dígitos;
    Aprenda também a utilizar a função rpad:
    http://jquerydicas.blogspot.com.br/2017/07/postgresql-funcao-rpad.html

    Deixe o seu comentário ou sugestão.
    Gostou?  Siga no Google +  ou Facebook

    sábado, 30 de agosto de 2014

    Postgresql - Função dense_rank - Exibir a posição dos valores

    Neste artigo, vamos apresentar 3 exemplos de como exibir as posições de acordo com valores de uma coluna, ou explicando de uma forma mais simples, como ranquear os valores de uma coluna.
    Veja o script com os exemplos no github.

    1º) Exemplo:

    Queremos exibir a classificação dos atletas em uma corrida de acordo com o tempo gasto para completar a prova.
    Para exibir a classificação vamos utilizar a tabela "tb_corrida" exibida abaixo:



    Solução:

    Para exibir a posição dos corredores utilizamos a sentença abaixo:

    SELECT
    DENSE_RANK() OVER(ORDER BY tempo_gasto
    ASC) AS posicao,
    inscricao,
    tempo_gasto,
    sexo
    FROM tb_corrida 


    Após a execução da sentença acima,  teremos o seguinte resultado:


    Observações
    • Utilizamos DENSE_RANK sobre a coluna que queremos obter a classificação, neste caso "tempo_gasto". 
    • Observe que DENSE_RANK esta acompanhado de "OVER", e dentro do "OVER" vamos colocar a coluna que vamos utilizar para obter as posições e de que maneira queremos a classificação "ASC" - crescente (do valor mais baixo até o valor mais alto) ou "DESC" - decrescente (do valor mais alto até o valor mais baixo).
    Repare que dois corredores ficaram empatados na 3ª posição. Através desse exemplo podemos perceber que a função dense_rank, leva em consideração os empates .

    2º) Exemplo:

    Queremos a classificação dos corredores separadas pelo sexo (masculino e feminino). Vamos utilizar a mesma tabela do primeiro exemplo,  "tb_corrida":






    Solução:
    Para exibir a posição dos corredores separadas por sexo utilizamos a sentença abaixo:

    SELECT
    DENSE_RANK() OVER(PARTITION BY sexo ORDER BY tempo_gasto
    ASC) AS posicao,
    inscricao,
    tempo_gasto,
    sexo
    FROM tb_corrida



    Após a execução da sentença acima,  teremos o seguinte resultado:


    Repare que a única alteração que fizemos foi incluir "PARTITION BY" dentro do OVER
    Após o PARTITION BY incluímos a coluna sexo, pois queremos que a classificação seja dividida por sexo.

    3º) Exemplo:

    Queremos a classificação dos vendedores em uma loja de acordo com o total das vendas.
    Para exibir a classificação vamos utilizar a tabela "tb_vendas" exibida abaixo:




    Solução:

    Para exibir a classificação dos vendedores de acordo com o total das vendas executamos a sentença a seguir:

    SELECT
    codigo_vendedor,
    SUM(valor),
    DENSE_RANK() OVER(ORDER BY SUM(valor) DESC) AS posicao
    FROM tb_vendas
    GROUP BY codigo_vendedor


    Após a execução da sentença acima,  teremos o seguinte resultado:



    Repare que utilizamos a função da agrupamento SUM dentro do OVER para que fossem classificadas as somas do valores (e não os valores individualmente) e utilizamos o "GROUP BY" para agrupar as somas por código do vendedor. Além disso utizamos o "ORDER BY" com DESC para agrupar da soma com maior valor até a soma com menor valor.

    A função  dense_rank pertence ao grupo de funções chamadas "window functions". Existem outras funções desse tipo, em breve publicaremos outras funções.

    Deixe suas sugestões ou críticas.

    terça-feira, 29 de outubro de 2013

    INSERT INTO SELECT

    Utilizando sql, você pode copiar dados de uma tabela para uma outra tabela.
    Para facilitar a compreensão da utilização do "INSERT INTO SELECT", vamos descrever um exemplo:
    Cenário: uma loja quer fazer uma promoção para os produto que vão vencer até o dia 28/11/2013.
    No nosso banco temos duas tabelas: "tb_produto" e "tb_vencimento".
    A tabela "tb_produto" possui informações sobre os produtos e a tabela "tb_vencimento" inicialmente está vazia. Veja a imagem abaixo:

    tb_produto

    tb_vencimento

    Selecionaremos os produtos da tabela "tb_produto" que vão vencer até o dia 28/11/2013 e incluiremos na tabela "tb_vencimento" 

    Para efetuar este procedimento executaremos a sentença abaixo:

    INSERT INTO tb_vencimento (produto_id, produto_desc, data)
    SELECT produto_id, produto_desc, produto_vencimento FROM tb_produto 
    WHERE produto_vencimento <= '2013-11-28';

    Significado da sentença:
    • Insira nas colunas produto_id, produto_desc e data da tabela tb_vencimento           INSERT INTO tb_vencimento (produto_id, produto_desc, data)
    • O conteúdo das colunas produto_id, produto_desc e produto_vencimento da tabela "tb_produto"                                                                                                       SELECT produto_id, produto_desc, produto_vencimento FROM tb_produto
    • Onde a data de vencimento seja menor ou igual a 28/11/2013  WHERE produto_vencimento <= '2013-11-28'

    Após a execução a tabela "tb_vencimento" já conterá os produtos que vão vencer até o dia 28/11/2013. Veja a imagem abaixo: