Somando Tipos Diferentes no SQL

Precisei fazer um relatóriozinho aqui no trabalho e confesso que bati a cabeça com esse problema que é bem simples de resolver, mas que só consegui com ajuda do meu grande amigo Nelsinho! Valeu irmão!!!

Eu tinha uma tabela com uma lista de IDs e cada ID tinha um status, então eu precisava mostrar em um relatório quantos IDs eu tinha no total, quantos foram aprovados+em andamento e por ano e mês. Meus dados estavam assim:

Então eu precisava fazer um select que me retornasse esse modelo aqui, sendo que “ids aprovados” são a soma de ids aprovado + ids em andamento.

O select que usei pra isso ficou assim:

O código inteiro pra quem quiser reproduzir no MS SQL :

create table t_ids (
id integer
,tipo varchar(50)
,datas date
)

insert into t_ids ( id , tipo , datas ) values
(1, ‘aprovado’, ‘2022-01-01’),
(2, ‘recusado’, ‘2022-01-01’),
(3, ’em andamento’, ‘2022-01-01’),
(4, ‘aprovado’, ‘2022-02-01’),
(5, ‘recusado’, ‘2022-02-01’),
(6, ’em andamento’, ‘2022-02-01’),
(7, ‘aprovado’, ‘2022-02-01’),
(8, ‘recusado’, ‘2022-02-01’),
(9, ’em andamento’, ‘2022-02-01’),
(10, ‘aprovado’, ‘2022-01-01’),
(11, ‘recusado’, ‘2022-01-01’),
(12, ’em andamento’, ‘2022-01-01’),
(13, ‘aprovado’, ‘2022-01-01’),
(14, ‘recusado’, ‘2022-01-01’),
(15, ’em andamento’, ‘2022-01-01’),
(16, ‘aprovado’, ‘2022-02-01’),
(17, ‘recusado’, ‘2022-02-01’),
(18, ’em andamento’, ‘2022-02-01’),
(19, ‘aprovado’, ‘2022-02-01’),
(20, ‘recusado’, ‘2022-02-01’)

select
year ( datas ) as ano
,month( datas ) as mes
, count ( id ) as total_ids
, sum (
case
when tipo = ‘aprovado’ then 1
when tipo = ’em andamento’ then 1
else 0
end
) as ids_aprovados
from t_ids
group by
year ( datas )
,month( datas )
order by
year ( datas ) asc
,month( datas ) asc

EDIT:

Esse post rendeu vários bons comentários no linkedin, então dá uma olhada lá: https://www.linkedin.com/posts/p3drocarvalho_somando-tipos-diferentes-no-sql-activity-6892263758526586882-Q6qa

Recentemente o Edison deu uma dica legal pra otimizar o código e até reduzir as linhas de código, ele disse o seguinte:

E colocando em prática, o código sugerido por ele ficaria assim:

Em texto pra você copiar, se quiser:

SELECT
year(datas) AS ano
,month(datas) AS mes
,count(id) AS total_ids
,sum(CASE
WHEN tipo = ‘aprovado’
THEN 1
WHEN tipo = ’em andamento’
THEN 1
ELSE 0
END) AS ids_aprovados
,sum(CASE tipo
WHEN ‘recusado’
THEN 0
ELSE 1
END) AS ids_aprovados_ed
,sum(IIF(tipo = ‘recusado’, 0, 1)) AS ids_aprovados_ed2
FROM t_ids
GROUP BY year(datas)
,month(datas)
ORDER BY year(datas) ASC
,month(datas) ASC

Published by Pedro Carvalho

Apaixonado por análise de dados e Power BI

Deixe uma resposta

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: