[Resolvido] MySQL - SELECT Count com "IF" e "ELSE"

14 respostas
B

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 :frowning:

14 Respostas

B

Consegui algo perto do que eu quero, pena que saiu na mesma linha :frowning:

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

Creio que precisará usar subselects aí, hein?

B

poderia me dar um exemplo velho?

D
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

Lembrando que isto não é performático, mas deve resolver.
Se trabalhar no case que estava montando, talvez seja mais elegante.

B

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

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

Pensei em duas possibilidades:

  1. 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.

  1. “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

AbelBueno:
Pensei em duas possibilidades:

  1. 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.

  1. “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

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

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

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 :slight_smile:

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 :slight_smile:

E

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

Coloquei a query no iReport utilizando o union all e funcionou exatamente como eu queria, muito obrigado mais uma vez :slight_smile:

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.

Agradeço a ajuda de todos.

Abraços,

Bruno

Criado 29 de junho de 2012
Ultima resposta 2 de jul. de 2012
Respostas 14
Participantes 4