[Resolvido] MySQL - SELECT Count com "IF" e "ELSE"
14 respostas
B
Bruno_M_Gasparotto
Boa tarde!
Tenho uma tabela com 150 linhas, e em 17 delas, a coluna “nm_equipe” contém o valor “DD”.
Preciso executar uma query que retorne tanto a quantidade de linhas que contem o valor DD, quanto a quantidade das que não tem. Como posso fazer isso em uma mesma query?
A query pra retornar apenas as 17 linhas mencionadas ficou assim:
Retorno:
Quantidade
17 | TC.DD.3
Gostaria de obter um retorno desse:
Quantidade
17 | TC.DD.3
133 | qualquer outro nome
Preciso disso para gerar um gráfico com base no resultset, estou quebrando a cabeça aki, agradeço se alguem puder ajudar
Consegui algo perto do que eu quero, pena que saiu na mesma linha
SELECT SUM(CASE
WHEN nm_equipe LIKE '%DD%' THEN 1
ELSE 0
END) AS DD,
SUM(CASE
WHEN nm_equipe LIKE '%DD%' THEN 0
ELSE 1
END) AS DC
FROM tb_servico_saida;
D
drsmachado
Creio que precisará usar subselects aí, hein?
B
Bruno_M_Gasparotto
poderia me dar um exemplo velho?
D
drsmachado
SELECT
(SELECT count(*) FROM tb_tua_tabela
WHERE
nm_equipe = 'DD') as qt_com_dd,
(SELECT count(*) FROM tb_tua_tabela
WHERE
nm_equipe <> 'DD') as qt_sem_dd
FROM
tb_tua_tabela
D
drsmachado
Lembrando que isto não é performático, mas deve resolver.
Se trabalhar no case que estava montando, talvez seja mais elegante.
B
Bruno_M_Gasparotto
Rodei seu código aki (com as adaptações necessárias) e ainda não rolou.
sem GROUP BY ele imprimiu algo como:
17,133
17,133
…
17,133
e com o GROUP BY ele imprimiu o mesmo que minha query com o SUM.
Vou tentar implementar isso no gráfico de qualquer forma, e ver como fica, até pq digamos que eu não domine seu comportamento em relação ao resultset ~~
obrigado pela ajuda cara!
edit: não ficou legal, realmente preciso que as quantidades sejam impressas uma embaixo da outra, ou seja, em um mesmo “field”.
D
drsmachado
Sim, eu postei apenas parte da solução.
Se não me engano, você precisa colocar todos os elementos da consulta no group by, caso contrário ele pode “ignorar” algumas coisas.
A
AbelBueno
Pensei em duas possibilidades:
Utilizar um union
select 'dd' tipo, count(*) qtd from tabela where campo like '%dd%'
union all
select 'não--dd' as tipo, count(*) from tabela where campo not like '%dd%'
Esse not like é péssimo pra performance (na verdade, tanto quanto o like em si), mas para pequenos volumes é aceitável.
“Criar” uma coluna a mais com o tipo da coluna (aquele dd ou não-dd da primeira query) e agrupoar por ela
select tipo, count(*) qtd
from
(
select case when campo like '%dd%' then 'dd' else 'não-dd' end tipo from tabela
)
D
drsmachado
AbelBueno:
Pensei em duas possibilidades:
Utilizar um union
select 'dd' tipo, count(*) qtd from tabela where campo like '%dd%'
union all
select 'não--dd' as tipo, count(*) from tabela where campo not like '%dd%'
Esse not like é péssimo pra performance (na verdade, tanto quanto o like em si), mas para pequenos volumes é aceitável.
“Criar” uma coluna a mais com o tipo da coluna (aquele dd ou não-dd da primeira query) e agrupoar por ela
select tipo, count(*) qtd
from
(
select case when campo like '%dd%' then 'dd' else 'não-dd' end tipo from tabela
)
Mas, precisa mesmo ser LIKE? Se os campos que quer somar são sempre ‘DD’, faça com = mesmo (não é java, logo o operador = vai servir para comparar valores).
A
AbelBueno
drsmachado:
Mas, precisa mesmo ser LIKE? Se os campos que quer somar são sempre ‘DD’, faça com = mesmo.
Na verdade, eu só mantive a regra que ele colocou na primeira query dele.
Funcionaria com qualquer expressão.
D
drsmachado
AbelBueno:
drsmachado:
Mas, precisa mesmo ser LIKE? Se os campos que quer somar são sempre ‘DD’, faça com = mesmo.
Na verdade, eu só mantive a regra que ele colocou na primeira query dele.
Funcionaria com qualquer expressão.
Entendi.
De qualquer forma, ao autor do tópico, fica a dica aí.
B
Bruno_M_Gasparotto
Já tinha fechado tudo pra ir embora quando dei o último F5 no forum, e vi as respostas, abri tudo dinovo pra testar haha.
O código acima resolveu meu problema, agora só basta eu configurar essas queries no programa, colocar pra rodar e cruzar os dedos
AbelBueno e drsmachado, me digam onde vcs moram pra eu pagar uma cerveja pra vcs, haha.
Abraços, segunda-feira dou o feedback quanto ao gráfico, mas quanto a query retornar no mesmo field, funcionou perfeitamente
E
evefuji
só uma observação, o like %dd% não é performático, mas o like dd% é. E inclusive o like dd% pode usar índice (se você definir), mas a melhor opção ainda seria a igualdade (sem substring)
B
Bruno_M_Gasparotto
Coloquei a query no iReport utilizando o union all e funcionou exatamente como eu queria, muito obrigado mais uma vez
Quanto ao LIKE vs operador de igualdade, é bom saber quanto a performance, porém na atual situação do meu BD, não existe um padrão para os nomes, o nome de uma equipe pode estar tanto no meio, no fim, ou até mesmo no começo, portanto tenho que usar o %x% (os dados que recebemos são externos, mas keremos padronizar).
Vou lembrar dessa dica qdo adotarmos um padrão, e dar uma revisada em muitas queries aki.