Translate

Mostrando postagens com marcador funções de agrupamento. Mostrar todas as postagens
Mostrando postagens com marcador funções de agrupamento. Mostrar todas as postagens

sábado, 7 de fevereiro de 2015

ORACLE - Calcular total /subtotal com ROLLUP

Neste artigo, vamos mostrar 3 exemplos de como utilizar a função "SUM" acompanhada do comando "ROLLUP" para calcular o subtotal / total em uma consulta.

Caso tenha interesse, faça o download ou veja os scripts deste artigo no github.
Você também pode executar os scripts e visualizar as tabelas no sqlfiddle. O script foi testado no Oracle 11g R2.

1º  Exemplo

Vamos calcular as despesas com fornecedor para cada segmento de uma empresa.
Iremos exibir o subtotal por segmento: "Papelaria e informática", "Marcenaria", "Serralheria" e "Limpeza e higiêne".
Também vamos exibir no final da consulta o total geral para todos os segmentos.
Neste exemplo, utilizaremos a tabela "tb_fornecedor". Veja a imagem da tabela a seguir:


Solução

Vamos utilizar a função "SUM" acompanhada de "GROUP BY" para fazer a quebra por segmento. Além disso vamos utilizar o "ROLLUP" para exibir o subtotal embaixo de cada quebra e o total geral no último registro.

Veja a sentença abaixo:

SELECT
    segmento,
    produto,
    SUM(valor)
FROM tb_fornecedor
GROUP BY ROLLUP(segmento, produto);

Após a execução da sentença teremos o resultado exibido a seguir:



2º  Exemplo

Para facilitarmos a interpretação do resultado da consulta vamos alterar o conteúdo da primeira coluna:
  • Nos registros que exibirem o subtotal, a primeira coluna será acompanhada da palavra "Subtotal" e do nome do segmento;
  • O ultimo registro da primeira coluna se chamará "Total Geral";
  • Nos outros registros o nome do segmento será mantido;
Solução

Veja a sentença abaixo: 

SELECT
CASE
WHEN (segmento IS NULL AND produto IS NULL) 
  THEN 'Total Geral'
WHEN (segmento IS NOT NULL AND produto IS NULL) 
  THEN  'Subtotal' || ' - ' || segmento  
ELSE segmento
END AS segmento,
produto,
SUM(valor)
FROM tb_fornecedor GROUP BY ROLLUP (segmento, produto);

Após a execução da sentença teremos o resultado exibido a seguir:



Foi utilizado o comando "CASE WHEN" na primeira coluna para verificar:
  • se o segmento e o produto eram nulos,  caso fossem, houve a substituição por "Total Geral";
  • se o segmento não era nulo e o produto era nulo, caso fossem, houve a substituição por "Subtotal" concatenado com o nome do segmento;
  • se nenhuma condição acima fosse verdadeira, mantivemos o conteúdo da coluna segmento;
Observação: utilizamos o operador de concatenação "||" para unir a palavra "Subtotal" ao conteúdo da coluna segmento;
Também podemos indicar o total geral na primeira coluna e os subtotais na segunda coluna.  Veja a sentença abaixo:

SELECT
CASE
WHEN (segmento IS NULL AND produto IS NULL) 
  THEN 'Total Geral'
ELSE segmento
END AS segmento,
CASE
WHEN (segmento IS NOT NULL AND produto IS NULL) 
  THEN 'Subtotal' || ' - ' || segmento
ELSE produto 
END AS produto,
SUM(valor) AS valor
FROM tb_fornecedor
GROUP BY ROLLUP (segmento, produto);

Após a execução da sentença teremos o resultado exibido a seguir:



3º  Exemplo

Neste exemplo, vamos mostrar como ordenar as colunas "segmento" e "produto", mantendo o "Total Geral" no último registro e o subtotal no final de cada segmento.

Solução

Vamos utilizar "ORDER BY" em uma subquery (subconsulta).

Veja a sentença abaixo: 

SELECT
COALESCE(segmento, 'TOTAL GERAL')  AS segmento,
CASE
 WHEN ((segmento IS NOT NULL) AND (produto IS NULL))
  THEN CONCAT('Subtotal - ', segmento)
  WHEN (segmento IS NOT NULL AND produto IS NOT NULL)
  THEN produto
END AS produto,
valor FROM
(
 SELECT
 segmento, 
 CASE
  WHEN(segmento IS NOT NULL) THEN 0
  ELSE 1
 END AS segmento_ordem, 
 produto, 
 CASE
  WHEN(produto IS NOT NULL) THEN 0
 ELSE 1
 END  AS produto_ordem,
 SUM(valor) AS valor
 FROM tb_fornecedor
 GROUP BY ROLLUP(segmento, produto)
) TOTAL
ORDER BY
segmento,
segmento_ordem,
produto_ordem,
produto;

A subquery que criamos está destacada na cor azul e está posicionada entre parenteses, esta subquery recebeu o alias (apelido) de TOTAL.

Observação: perceba que utilizamos duas vezes o "CASE WHEN" na subquery:
  • o primeiro para que o "TOTAL GERAL" fosse exibido no último registo da coluna "segmento" independente da ordem alfabética;
  • o segundo para que o "Subtotal" fosse exibido no final de cada segmento da coluna "produto" independente da ordem alfabética;
Após a execução da sentença, teremos o resultado exibido a seguir:


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

domingo, 25 de janeiro de 2015

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 "SUM", veja o artigo "PostgreSql SUM - Soma "

Caso tenha interesse, faça o download ou veja o script deste artigo no github.
O script está disponível para execução através do SQL Fiddle e foi testado no PostgreSql 9.1.9.

1º Exemplo

Vamos calcular as despesas com fornecedor para cada segmento de uma empresa.
Iremos exibir o subtotal por segmento: "Papelaria e informática", "Marcenaria", "Serralheria" e "Limpeza e higiêne".
Também vamos exibir no final da consulta o total geral para todos os segmentos.
Neste exemplo, utilizaremos a tabela "tb_fornecedor". Veja a imagem da tabela a seguir:


Solução

Temos duas formas de fazer esta consulta, podemos utilizar subquery ou o comando WITH, vamos mostrar as duas formas, use a que for mais fácil para você.

Primeiro vamos mostrar a solução com subquery. Veja a sentença abaixo:

SELECT
segmento,
produto,
valor
FROM
(
SELECT segmento, produto, SUM(valor) valor
FROM tb_fornecedor
GROUP BY segmento, produto
UNION ALL
SELECT segmento, NULL AS  produto, SUM(valor) valor
FROM tb_fornecedor
GROUP BY segmento
UNION ALL
SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor
FROM tb_fornecedor
) CALCULO
ORDER BY segmento, produto;

Nesta consulta, criamos uma subquery chamada CALCULO, o conteúdo da subquery está entre parenteses. A subquery contém três comandos "SELECT" com a seguinte função:

  • o primeiro "SELECT" agrupa a soma por segmento e produto;
  • o segundo "SELECT" agrupa a soma por segmento;
  • o terceiro  "SELECT" calcula a soma de todos os produtos;
Repare que os registros retornados pelos comandos "SELECT" serão unidos através do comando "UNION ALL";
Observe também que os comandos "SELECT" da subquery foram intercalados com valores nulos "NULL", para que a quantidade de colunas fossem as mesmas em cada consulta.

Após a execução da sentença teremos o resultado exibido a seguir:



Agora vamos mostrar a solução utilizando o comando "WITH". Veja a sentença abaixo:

WITH CALCULO AS
(
SELECT segmento, produto, SUM(valor) valor
FROM tb_fornecedor
GROUP BY segmento, produto
UNION
SELECT segmento, NULL AS  produto, SUM(valor) valor
FROM tb_fornecedor
GROUP BY segmento
UNION
SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor
FROM tb_fornecedor
)
SELECT
segmento,
produto,
valor
FROM calculo
ORDER BY segmento, produto;

2º Exemplo

Para facilitarmos a interpretação do resultado da consulta vamos indicar o "Total Geral" e o "Subtotal" na consulta.

Solução
  • Total Geral: colocaremos a indicação de "Total Geral" na primeira coluna, onde o valor do registro da primeira coluna apresentar valor nulo. Para fazer isso, vamos utilizar o comando "COALESCE";
  • Subtotal: colocaremos a indicação de "Subtotal" na segunda coluna, onde o valor do registro da primeira coluna for diferente de nulo e o valor da segunda coluna for nulo. Para fazer isso, utilizamos o comando "CASE WHEN";
Temos duas formas de fazer esta consulta, podemos utilizar "subquery" ou o comando "WITH", vamos mostrar as duas formas, use a que for mais fácil para você.

Primeiro vamos mostrar a solução com subquery. Veja a sentença abaixo:

SELECT
COALESCE(segmento, 'TOTAL GERAL')  AS segmento,  
CASE 
WHEN(segmento IS NOT NULL AND produto IS NOT NULL) THEN produto 
WHEN(segmento IS NOT NULL AND produto IS NULL) THEN 'SUBTOTAL' || ' - '|| segmento
END AS produto,
valor
FROM
(
 SELECT segmento, produto, SUM(valor) valor
 FROM tb_fornecedor
 GROUP BY segmento, produto
 UNION
 SELECT segmento, NULL AS  produto, SUM(valor) valor
 FROM tb_fornecedor
 GROUP BY segmento
 UNION
 SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor
 FROM tb_fornecedor
) CALCULO
ORDER BY
CASE
  WHEN(segmento IS NOT NULL) THEN CAST(0 AS INTEGER)
  ELSE CAST(1 AS INTEGER)
END
, segmento,
CASE
  WHEN(produto IS NOT NULL) THEN CAST(0 AS INTEGER)
  ELSE CAST(1 AS INTEGER)
END,
produto;

Após a execução da sentença teremos o resultado exibido a seguir:


Observação: perceba que no "ORDER BY" utilizamos duas vezes o "CASE WHEN":
  • o primeiro para que o "TOTAL GERAL" fosse exibido no último registo da coluna "segmento" independente da ordem alfabética;
  • o segundo para que o "Subtotal" fosse exibido no final de cada segmento da coluna "produto" independente da ordem alfabética;
Agora vamos mostrar a solução utilizando o comando "WITH". Veja a sentença abaixo:

WITH CALCULO AS
(
 SELECT segmento, produto, SUM(valor) valor
 FROM tb_fornecedor
 GROUP BY segmento, produto
 UNION
 SELECT segmento, NULL AS  produto, SUM(valor) valor
 FROM tb_fornecedor
 GROUP BY segmento
 UNION
 SELECT NULL AS segmento, NULL AS produto, SUM(valor) AS valor
 FROM tb_fornecedor
)
SELECT
COALESCE(segmento, 'TOTAL GERAL') AS segmento,  
CASE 
WHEN(segmento IS NOT NULL AND produto IS NOT NULL) THEN produto 
WHEN(segmento IS NOT NULL AND produto IS NULL) THEN 'SUBTOTAL' || ' - '|| segmento
END AS produto,
valor
FROM calculo
ORDER BY
CASE
  WHEN(segmento IS NOT NULL) THEN CAST(0 AS INTEGER)
  ELSE CAST(1 AS INTEGER)
END,
segmento,
CASE
  WHEN(produto IS NOT NULL) THEN CAST(0 AS INTEGER)
  ELSE CAST(1 AS INTEGER)
END,
produto;

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

domingo, 18 de janeiro de 2015

MySql - SUM COM ROLLUP - Calcular o subtotal / total

Neste artigo, vamos mostrar 3 exemplos de como utilizar a função "SUM" acompanhada do comando "WITH ROLLUP" para calcular o subtotal / total em uma consulta.
Caso ainda não conheça a função "SUM", veja o artigo "Mysql SUM - Soma "

Caso tenha interesse, faça o download ou veja o script deste artigo no github.
O script também está disponível para execução no Sql Fiddle e foi testado no Mysql 5.1.61.

1º  Exemplo

Vamos calcular as despesas com fornecedor para cada segmento de uma empresa.
Iremos exibir o subtotal por segmento: "Papelaria e informática", "Marcenaria", "Serralheria" e "Limpeza e higiêne".
Também vamos exibir no final da consulta o total geral para todos os segmentos.
Neste exemplo, utilizaremos a tabela "tb_fornecedor". Veja a imagem da tabela a seguir:


Solução

Vamos utilizar a função "SUM" acompanhada de "GROUP BY" para fazer a quebra por segmento. Além disso vamos utilizar o "WITH ROLLUP" para exibir o subtotal embaixo de cada quebra e o total geral no último registro.

Veja a sentença abaixo:

SELECT
    segmento,
    produto,
    SUM(valor)
FROM tb_fornecedor
GROUP BY  segmento, produto WITH ROLLUP;

Após a execução da sentença teremos o resultado exibido a seguir:



2º  Exemplo

Para facilitarmos a interpretação do resultado da consulta vamos alterar o conteúdo da primeira coluna:
  • Nos registros que exibirem o subtotal, a primeira coluna será acompanhada da palavra "Subtotal" e do nome do segmento;
  • O ultimo registro da primeira coluna se chamará "Total Geral";
  • Nos outros registros o nome do segmento será mantido;
Solução

Veja a sentença abaixo: 

SELECT
    IF
    (
      segmento IS NULL,
      'Total Geral',
      IF (produto IS NULL, CONCAT('Subtotal - ', segmento), segmento)
    )
    AS segmento,
    produto,
    SUM(valor) as valor
FROM tb_fornecedor
GROUP BY  segmento, produto WITH ROLLUP;

Após a execução da sentença teremos o resultado exibido a seguir:


  • Utilizamos a condição "IF" para verificar onde o segmento era nulo e substituímos por "Total Geral";
  • Para segmento não nulo fizemos uma outra verificação. Foi encadeado um outro "IF" para verificar onde o produto era nulo e substituímos por "Subtotal" acompanhado do  nome do segmento, caso o produto não fosse nulo mantivemos o nome do segmento;
  • Observação: utilizamos a função "CONCAT" para unir a palavra "Subtotal" ao conteúdo da coluna segmento;

3º  Exemplo

Não é possível utilizar "WITH ROLLUP" com "ORDER BY" na mesma consulta. Neste exemplo, vamos mostrar como ordenar colunas utilizando uma subquery (subconsulta). Vamos ordenar as colunas "segmento" e "produto" em ordem decrescente.

Solução

Veja a sentença abaixo: 

SELECT
COALESCE(segmento, 'TOTAL GERAL')  AS segmento,
CASE
 WHEN ((segmento IS NOT NULL) AND (produto IS NULL))
  THEN CONCAT('Subtotal - ', segmento)
  WHEN (segmento IS NOT NULL AND produto IS NOT NULL)
  THEN produto
END AS produto,
valor FROM
(
 SELECT
 segmento, 
 produto, 
 SUM(valor) AS valor
 FROM tb_fornecedor
 GROUP BY segmento, produto WITH ROLLUP
) TOTAL
ORDER BY
CASE
 WHEN(segmento IS NOT NULL) THEN 0
 ELSE 1
END,
segmento DESC,
CASE
 WHEN(produto IS NOT NULL) THEN 0
 ELSE 1
END,
produto DESC;

A subquery que criamos está destacada na cor azul e posicionada entre parenteses, esta subquery recebeu o alias (apelido) de TOTAL.

Observação: perceba que no "ORDER BY" utilizamos duas vezes o "CASE WHEN":
  • o primeiro para que o "TOTAL GERAL" fosse exibido no último registo da coluna "segmento" independente da ordem alfabética;
  • o segundo para que o "Subtotal" fosse exibido no final de cada segmento da coluna "produto" independente da ordem alfabética;
Após a execução da sentença, teremos o resultado exibido a seguir:


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

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.

    domingo, 23 de novembro de 2014

    Postgresql - Funcão MAX

    A função MAX retorna o valor máximo (maior 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 MAX(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 alto?

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

    SELECT MAX(valor) FROM tb_imoveis;

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


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

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



    2º Exemplo

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

    tb_treino

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

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

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

    Após a execução, teremos o pior 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, 
    MAX(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 pior treino? Qual a data que o treino ocorreu?
    Neste exemplo, utilizaremos a tabela "tb_treino".




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

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

      SELECT 
      atleta_id,   
      data, 
      tempo AS pior_tempo
      FROM tb_treino 
      WHERE tempo =
      (
          SELECT MAX(tempo)
          FROM tb_treino
      )

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


      Observação:

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

      WHERE tempo = MAX(tempo)

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

      segunda-feira, 3 de fevereiro de 2014

      Mysql - função count

      O artigo apresenta 8 exemplos de como utilizar a função de agrupamento "count", das seguintes formas:
      • COUNT(*);
      • COUNT(nome_da_coluna);
      • COUNT COM GROUP BY;
      • COUNT(DISTINCT(nome_da_coluna));
      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:


      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 "date_format" é utilizada para exibir a data no formato (mm/aaaa).

      SELECT
      CASE WHEN data_final IS NOT NULL
          THEN  date_format(data_final, '%m/%Y')
      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
      date_format(data_final, '%m/%Y') AS mes_ano,
      COUNT(*) AS qtd_os
      FROM tb_ordem_servico
      GROUP BY date_format(data_final, '%m/%Y');

      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  date_format(data_final, '%m/%Y')
          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
      date_format(data_final, '%m/%Y') AS mes_ano,
      COUNT(data_final) AS qtd_os
      FROM tb_ordem_servico
      WHERE data_final IS NOT NULL
      GROUP BY mes_ano;

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




      Caso você queira ordenar por ano e mês em ordem crescente, utilize o comando "ORDER BY". 
      Repare que no "ORDER BY" foi invertidos os parâmetros do date_format (destacado em azul): para ano e depois mês. Para que seja exibido primeiro os meses de 2013 e depois o meses de 2014.

      SELECT
      date_format(data_final, '%m/%Y') AS mes_ano,
      COUNT(*) AS qtd_os_finalizadas
      FROM tb_ordem_servico
      WHERE data_final IS NOT NULL
      GROUP BY date_format(data_final, '%m/%Y')
      ORDER BY date_format(data_final, '%Y/%m');

      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
      date_format(data_final, '%m/%Y') 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
      date_format(data_final, '%m/%Y') AS mes_ano,
      cod_servico,
      COUNT(*) AS qtd_os_finalizadas
      FROM tb_ordem_servico
      WHERE data_final IS NOT NULL
      GROUP BY date_format(data_final, '%m/%Y'), cod_servico
      ORDER BY date_format(data_final, '%Y/%m'), cod_servico;

      Após a execução da consulta, será exibido o resultado 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.