Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guilherme Luiz

Count() de colunas com conteudo especifico no SELECT

Recommended Posts

Olá pessoal,

Estou montando um gráfico utilizando a ferramenta do site AMCharts.

Tenho a seguinte query

"SELECT *, 
count(id_interno) AS totalEnvio,
data_envio AS dataEnvio,
status AS situacao
FROM sms_status 
WHERE chave_especial_user='$chave_especial' and data_envio
BETWEEN '$dataINICIAL 00:00:00' AND '$dataFINAL 23:59:59'
GROUP BY DAY(data_envio), MONTH(data_envio), YEAR(data_envio)
ORDER BY data_envio ASC";

Nessa query estou buscando registros entre um gap de datas do usuario logado.

A pesquisa sai bonitinha, consigo ter o resultado agrupado por dia e ter a conta do total de envios por dia.

O que não estou conseguindo fazer é o seguinte:

Na coluna status eu posso ter status dos tipos 1 - 2 - 4 - 5 - 16

Tais resultados significam

1 - Entregue

2 - Rejeitado

4 - Pendente

5 - Agendado

16 - Não entregue

No meu gráfico eu quero ter apenas três linhas sendo:

1º linha - Mostra o total de envios feitos por dia dentro do período pesquisado (pego atraves do count(id_interno))

2º linha - Mostra o total de envios entregues dentro do período pesquisado (contempla apenas o status 1)

3º linha - Mostra o total de envios não entregues dentro do periodo pesquisado (contempla os status 2 e 16).

Tentei na propria query um comando COUNT(status = 1) as totalEntregue mas sem sucesso.

Alguem pode me ajudar a como fazer essa conta condicional?

Obrigado pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw pela dica Motta.

Vivendo e aprendendo, não sabia que na query tinha comandos IF e muito menos sabia que podia condicionar o COUNT() dentro dele mesmo.

Segue minha query final

SELECT *, 
count(id_interno) AS totalEnvio,
data_envio AS dataEnvio,
count(if( status=1, status, null)) as totalEntregue,
count(if( status=4, status, null)) as totalOperadora,
count(if( status=2, status, null)) as totalRejeitado,
count(if( status=16,status, null)) as totalNAOEntregue
FROM sms_status 
WHERE chave_especial_user='$chave_especial' and data_envio
BETWEEN '$dataINICIAL 00:00:00' AND '$dataFINAL 23:59:59'
GROUP BY DAY(data_envio), MONTH(data_envio), YEAR(data_envio)
ORDER BY data_envio ASC

Agora só uma duvida... eu fiz 2 IF() para contabilizar os registros não entregues onde eu somo o retorno de totalRejeitado e totalNAOEntregue... tem como num unico IF somar esses dois para que os valores já saiam impressos e calculados pelo SQL?

Compartilhar este post


Link para o post
Compartilhar em outros sites

...

count(if( status in (2,16), status, null)) as totalxxxxx

...

Compartilhar este post


Link para o post
Compartilhar em outros sites

...

count(if( status in (2,16), status, null)) as totalxxxxx

...

Muito obrigado Motta

Segue query final para quem interessar e modificar de acordo com o próprio projeto:

SELECT *, 
count(id_interno) AS totalEnvio,
data_envio AS dataEnvio,
count(if( status=1, status, null)) as totalEntregue,
count(if( status in (4,5), status, null)) as totalOperadora,
count(if( status in (2,16),status, null)) as totalNAOEntregue
FROM sms_status 
WHERE chave_especial_user='$chave_especial' and data_envio
BETWEEN '$dataINICIAL 00:00:00' AND '$dataFINAL 23:59:59'
GROUP BY DAY(data_envio), MONTH(data_envio), YEAR(data_envio)
ORDER BY data_envio ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.