Postgresql - função count
Tecnologia da Informação

Postgresql - função count


O artigo apresenta 8 exemplos de como utilizar a função de agrupamento "count", das seguintes formas:


Caso tenha interesse faça o download dos scripts ou veja no GitHub. 

Nestes exemplos, vamos utilizar a tabela "tb_ordem_servico" que armazena informações sobre ordens de serviço (solicitações de serviços). Exibimos a seguir a imagem da tabela e a descrição das colunas:

    • cod_ordem: código da ordem de serviço;
    • cod_servico: código do serviço que será prestado;
    • data_inicial: data da solicitação da ordem de serviço;
    • data_final: data de encerramento da ordem de serviço;

    FUNÇÃO COUNT(*)

    A função COUNT(*) retorna o número de registros (linhas) de uma tabela.

    SINTAXE
    SELECT COUNT(*) FROM nome_da_tabela;

    1º Exemplo
    Exibir quantidade de registros da tabela "tb_ordem_servico".

    Solução
    Para exibir a quantidade de registros, vamos executar a sentença abaixo:

    SELECT COUNT(*) FROM tb_ordem_servico;

    Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



    O nome da coluna recebeu o nome da função "count". Caso seja preciso alterar o nome da coluna, por exemplo, para "quantidade", crie uma alias "apelido". Para isso coloque um AS após a função COUNT(*).

    SELECT COUNT(*) AS quatidade FROM tb_ordem_servico;

    Após a execução do comando, o nome da coluna será exibido como "quantidade", veja a imagem abaixo:


    FUNÇÃO COUNT(nome_da_coluna)


    A função COUNT(nome_da_coluna) retorna o número valores de uma coluna. Valores nulos não entram na contagem.

    SINTAXE

    SELECT COUNT(nome_da_coluna) FROM nome_da_tabela;


    2º Exemplo
    Exibir a quantidade de registros onde o código do serviço seja do tipo "A". 


    Solução
    Para fazer a contagem, executamos a sentença abaixo:

    SELECT 
    COUNT(cod_servico) AS quantidade
    FROM tb_ordem_servico
    WHERE cod_servico = 'A';

    Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



    3º Exemplo
    Exibir a quantidade de ordens de serviços que já foram finalizadas. 

    Solução
    As ordens de serviços finalizadas são aquelas que possuem uma data de encerramento. Logo vamos utilizar a função COUNT na coluna data_final
    Para fazer a contagem, executamos a sentença abaixo: 

    SELECT 
    COUNT(data_final) AS quantidade
    FROM tb_ordem_servico;

    Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



    Observação: perceba que os valores nulos não são incluídos na contagem

    4º Exemplo
    Exibir a quantidade de ordens de serviços que não foram finalizadas.

    Solução
    As ordens de serviços não finalizadas são aquelas que ainda não possuem data de encerramento,  logo vamos fazer a contagem dos registros onde o valor a coluna "data_final" seja nulo. 

    Como precisamos contar valores nulos, vamos utilizar "COUNT(*)", pois COUNT(nome_da_coluna) ignora valores nulos.


    SELECT 
    COUNT(*) AS quantidade
    FROM tb_ordem_servico WHERE data_final IS NULL;

    Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



    5º Exemplo
    Distribuição por tipo de serviço:
    • Quantidade de solicitações para o serviço "A";
    • Quantidade de solicitações para o serviço "B";
    • Quantidade de solicitações para o serviço "C";
    Solução

    Para exibir a distribuição por tipo de serviço vamos agrupar os dados da coluna "cod_servico" através do comando "group by".

    SELECT
    cod_servico,
    COUNT(cod_servico) AS quantidade
    FROM tb_ordem_servico 
    GROUP BY cod_servico;

    Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



    Se quisermos ordenar o serviço por ordem alfabética utilizamos o comando "ORDER BY".

    SELECT
    cod_servico,
    COUNT(cod_servico) AS quantidade
    FROM tb_ordem_servico
    GROUP BY cod_servico
    ORDER BY cod_servico;

    6º Exemplo
    Quantidade de ordens finalizadas por mês e ano (mm/aaaa):

    Solução

    Para exibir a distribuição por mês e ano vamos utilizar a funcão "COUNT(nome_da_coluna)" e agrupar os dados da coluna através do comando "group by". 
    A coluna utilizada será a "data_final", pois indica a data de encerramento da ordem de serviço. 
    A função "to_char" é utilizada para exibir a data no formato (mm/aaaa).

    SELECT
    CASE WHEN data_final IS NOT NULL
        THEN  to_char(data_final, 'MM/YYYY')
    END mes_ano,
    COUNT(data_final) AS qtd_os
    FROM tb_ordem_servico
    GROUP BY mes_ano;

    Após a execução da sentença obtemos o seguite resultado.




    Observação: repare que os valores nulos não entraram na contagem, pois utilizamos a função COUNT(nome_da_coluna).

    Para que os valores nulos entrem na contagem vamos utilizar a função COUNT(*)

    SELECT
    to_char(data_final, 'MM/YYYY') AS mes_ano,
    COUNT(*) AS qtd_os
    FROM tb_ordem_servico
    GROUP BY to_char(data_final, 'MM/YYYY');

    Após a execução do comando, os valores nulos entram na contagem.




    Podemos colocar a mensagem "Pendente" para indicar a quantidade de ordens de serviço que não possuem data de encerramento.

    SELECT
    CASE WHEN data_final IS NOT NULL
        THEN  to_char(data_final, 'MM/YYYY')
        ELSE 'Pendente'
    END mes_ano,
    COUNT(*) AS qtd_os
    FROM tb_ordem_servico
    GROUP BY mes_ano;

    Após a execução do comando, teremos o resultado, conforme exibido na imagem a seguir:



    Se não quisermos exibir a contagem de valores nulos, utilizamos um filtro no "WHERE":

    SELECT
    to_char(data_final, 'MM/YYYY') AS mes_ano,
    COUNT(data_final) AS qtd_os
    FROM tb_ordem_servico
    WHERE data_final IS NOT NULL
    GROUP BY mes_ano;



    Caso você queira ordenar por ano e mês em ordem crescente utilize o comando "ORDER BY".

    SELECT
    to_char(data_final, 'YYYYMM') AS ordem_data,
    to_char(data_final, 'MM/YYYY') AS mes_ano,
    COUNT(*) AS qtd_os_finalizadas
    FROM tb_ordem_servico
    WHERE data_final IS NOT NULL
    GROUP BY to_char(data_final, 'MM/YYYY'), to_char(data_final, 'YYYYMM') 
    ORDER BY to_char(data_final, 'YYYYMM');

    Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:



    Caso você não queira exibir a coluna "ordem_data" você pode montar uma subquery. 

    Observação

    Uma subquery é "uma query dentro de outra query" ou uma "consulta dentro de outra consulta". 
    O conteúdo que está entre parênteses, destacado em azul, é uma subquery. Ela está depois do primeiro FROM é como se ela fosse uma tabela com as colunas "ordem_data", "mes_ano" e "qtd_os_finalizadas". O primeiro FROM acessa as colunas da subquery.
    Depois da subquery devemos criar um alias (apelido), aqui foi utilizado o "Q" de query mas poderiaa ser um outro. 

    SELECT mes_ano, qtd_os_finalizadas
    FROM
    (
    SELECT
    to_char(data_final, 'YYYYMM') AS ordem_data,
    to_char(data_final, 'MM/YYYY') AS mes_ano,
    COUNT(*) AS qtd_os_finalizadas
    FROM tb_ordem_servico
    WHERE data_final IS NOT NULL
    GROUP BY to_char(data_final, 'MM/YYYY'), to_char(data_final, 'YYYYMM') 
    ORDER BY to_char(data_final, 'YYYYMM')
    ) Q
    ORDER BY ordem_data;

    Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:



    7º Exemplo
    Quantidade de ordens finalizadas por mês e ano (mm/aaaa) e por tipo de serviço.

    Solução:

    Perceba que neste exemplo estamos fazendo o agrupamento de 2 colunas. Vamos utilizar o COUNT(*) para a contagem, e o "group by" para o agrupamento.

    SELECT
    to_char(data_final, 'MM/YYYY') AS mes_ano, 
    cod_servico,
    COUNT(*) AS qtd_os
    FROM tb_ordem_servico
    WHERE data_final IS NOT NULL
    GROUP BY mes_ano, cod_servico;

    Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:



    Caso você queira ordenar em crescente o ano/mês e o serviço, utilize o comando "ORDER BY".

    Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:

    SELECT
    to_char(data_final, 'YYYYMM') AS ordem_data,
    to_char(data_final, 'MM/YYYY') AS mes_ano,
    cod_servico,
    COUNT(*) AS qtd_os_finalizadas
    FROM tb_ordem_servico
    WHERE data_final IS NOT NULL
    GROUP BY to_char(data_final, 'MM/YYYY'), to_char(data_final, 'YYYYMM') ,  cod_servico
    ORDER BY to_char(data_final, 'YYYYMM'), cod_servico;

    Após a execução da consulta, foi exibido o resultado a seguir



    Caso você não queira exibir a coluna "ordem_data" você pode montar uma subquery.

    SELECT mes_ano, cod_servico, qtd_os_finalizadas
    FROM
    (
    SELECT
    to_char(data_final, 'YYYYMM') AS ordem_data,
    to_char(data_final, 'MM/YYYY') AS mes_ano,
        cod_servico,
    COUNT(*) AS qtd_os_finalizadas
    FROM tb_ordem_servico
    WHERE data_final IS NOT NULL
    GROUP BY to_char(data_final, 'MM/YYYY'), to_char(data_final, 'YYYYMM') , cod_servico
    ORDER BY to_char(data_final, 'YYYYMM') , cod_servico
    ) Q
    ORDER BY ordem_data, cod_servico;

    Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:




    FUNÇÃO COUNT(DISTINCT(nome_da_coluna))

    SINTAXE

    SELECT COUNT(DISTINCT(nome_da_coluna)) FROM nome_da_tabela;

    Neste exemplo, vamos explicar como utilizar a função "distinct" dentro da função "count".
    Utilizando a função "count" desta forma, os valores iguais só são contados uma vez.

    Pareceu complicado? Veja o exemplo.


    8º Exemplo

    Observação: Incluímos a coluna cliente na tabela "tb_ordem_servico".


    Exibir quantas empresas fizeram solicitação de ordem de serviço.



    Solução:

    Se observarmos a coluna "cliente" veremos que 3 empresas fizeram solicitação a "Padaria P", a  "Marcenaria M" e o "HOSPITAL H".

    Para retornar o resultado através de comando SQL executamos a sentença abaixo:

    SELECT COUNT(DISTINCT(cliente))  FROM tb_ordem_servico;

    Após executar a sentença, teremos o resultado, conforme exibido na imagem a seguir:



    Faça um comentário no final do artigo, suas sugestões ou críticas serão bem-vindas.



    loading...

    - Postgresql - Calcular Subtotal / Total - Equivalente Ao With Rollup No Mysql
    Neste artigo, vamos mostrar 2 exemplos de como utilizar a função "SUM" para calcular o subtotal / total em uma consulta. Para quem usa o Mysql, a consulta que vamos fazer é semelhante ao "WITH ROLLUP". Caso ainda não conheça a função...

    - Postgresql Avg - Média
    A função AVG retorna a média de valores de uma coluna.  Serão descritos 6 exemplos de utilização desta função.  Caso tenha interesse faça o download dos exemplos ou veja os scripts no github. SINTAXESELECT AVG(nome_da_coluna)...

    - Postgresql - Diferença Entre Datas
    Neste post vamos apresentar 4 exemplos de como calcular a diferença entre datas. Caso tenha interesse, faça o download ou veja o script no Github. Para calcular a diferença entre duas datas, em dias, no postgresql utilizamos o operador aritmético...

    - Postgresql - Formatar Data
    Serão descritos 2 exemplos de como formatar uma data. 1º Exemplo: exibir a data no formato dd/mm/aaaa (dia/mês/ano): Solução: vamos utilizar a função to_char para formatar a data. Na imagem abaixo, vemos a tabela "tb_fornecedor", vamos...

    - Postgresql Sum - Soma
    A função SUM retorna a soma de valores de uma coluna. SINTAXE SELECT SUM(nome_da_coluna) FROM nome_da_tabela; Para os 6 exemplos abaixo, utilizaremos a tabela "tb_fornecedor". Veja a imagem abaixo: 1º Exemplo Cenário: um funcionário quer...



    Tecnologia da Informação




    



    .