Sql - Select count

28/04/2016

0

Boa tarde, uma ajuda por favor, possuo a tabela "frequencia", no qual eu guardo no campo "Tipo"(OK,Falta ou Folga), eu gostaria de montar um select count dessa forma:

Nome do colaborador | Quantidade presença | Quantidade Falta | Quantidade Folga

tentei o seguinte Sql direto no banco com o MySQL-Front:

select
Colaborador,
(select count(*) from frequencia where Tipo = 'OK') as Presença,
(select count(*) from frequencia where Tipo = 'Falta') as Falta,
(select count(*) from frequencia where Tipo = 'Folga') as Folga
from frequencia
group by Tipo;

Porém eles etá retornando repetindo as linhas com o Total da tabela e não por colaborador, aonde estou errando ?:

[img:descricao=Retorno do Select ]https://gallery.mailchimp.com/3677b065d74669470fa0f6d88/images/7f12106e-39f3-4fb4-af3c-6ed094eb6eb9.png[/img]

Esse é o Banco:

[img:descricao=Banco Frequencia]https://gallery.mailchimp.com/3677b065d74669470fa0f6d88/images/7178973d-21f2-4ad7-806f-c236b236dc1b.png[/img]

Muito Obrigado!!!
Mauro Monteiro

Mauro Monteiro

Responder

Post mais votado

28/04/2016

Falta identificar o colaborador nas subqueries...

Adapte a partir de :

select
feq1.Colaborador,
(select count(1) from frequencia feq2 where feq2.Tipo = 'OK' and feq2.Colaborador = feq1.Colaborador) as Presença,
(select count(1) from frequencia feq3 where feq3.Tipo = 'Falta' and feq3.Colaborador = feq1.Colaborador) as Falta,
(select count(1) from frequencia feq4 where feq4.Tipo = 'Folga' and feq4.Colaborador = feq1.Colaborador) as Folga
from frequencia feq1
group by feq1.Tipo;


P.S.: Procure, sempre, utilizar count(1) e não count(*), pois a soma por uma constante é mais performática !

Marcos P

Marcos P
Responder

Mais Posts

28/04/2016

Mariana Carvalho

Acompanhando.
Responder

28/04/2016

Mateus Ribeiro

Boa tarde!

SELECT F.COLABORADOR,
       (SELECT COUNT(1) FROM FREQUENCIA WHERE TIPO = 'OK' AND ID_COLABORADOR = F.ID_COLABORADOR) PRESENCA,
       (SELECT COUNT(1) FROM FREQUENCIA WHERE TIPO = 'Falta' AND ID_COLABORADOR = F.ID_COLABORADOR) FALTA,
       (SELECT COUNT(1) FROM FREQUENCIA WHERE TIPO = 'Folga' AND ID_COLABORADOR = F.ID_COLABORADOR) FOLGA
 WHERE FREQUENCIA F
Responder

29/04/2016

Mauro Monteiro

Muito Obrigado pessoal,
ficou claro pra mim agora o funcionamento das subqueries na aplicação direta no Banco, mais como eu aplico com filtro Mes e Ano da minha tabela, eu já tenho uma tela no qual é possível consultar por meio de combobox e obter os resultados total e por colaborador, vou colocar parte do código aqui e o print da tela funcionando, o maior problema pra mim é gerar essa relatório no formato solicitado pelo cliente, e com esse filtro Mes e Ano, eu agradeço muito a quem poder ajudar!!

procedure TFRMCONTROLDIARIO.SpeedButton_frequenciaClick(Sender: TObject);

begin
Dm.ZQuery_control_frequencia.Active := false;
Dm.ZQuery_control_frequencia.SQL.Clear;
Dm.ZQuery_control_frequencia.SQL.Add('Select * from frequencia where Ano like'+QuotedStr(CBBOX_ano.text+'%'));
Dm.ZQuery_control_frequencia.SQL.Add('and Mes like '+QuotedStr(Edt_mes.text));
Dm.ZQuery_control_frequencia.SQL.Add('and Colaborador like '+QuotedStr(DBLookupCBX_colab.text));
Dm.ZQuery_control_frequencia.SQL.Add('and Tipo like '+QuotedStr(Edit_ok.text));
Dm.ZQuery_control_frequencia.Open;

Label_OK.Caption := 'Presença = ' + IntToStr(Dm.ZQuery_control_frequencia.RecordCount);

Dm.ZQuery_control_frequencia.Active := false;
Dm.ZQuery_control_frequencia.SQL.Clear;
Dm.ZQuery_control_frequencia.SQL.Add('Select * from frequencia where Ano like'+QuotedStr(CBBOX_ano.text+'%'));
Dm.ZQuery_control_frequencia.SQL.Add('and Mes like '+QuotedStr(Edt_mes.text));
Dm.ZQuery_control_frequencia.SQL.Add('and Colaborador like '+QuotedStr(DBLookupCBX_colab.text));
Dm.ZQuery_control_frequencia.SQL.Add('and Tipo like '+QuotedStr(Edit_Falta.text));
Dm.ZQuery_control_frequencia.Open;

Label_Falta.Caption := 'Falta = ' + IntToStr(Dm.ZQuery_control_frequencia.RecordCount);

Dm.ZQuery_control_frequencia.Active := false;
Dm.ZQuery_control_frequencia.SQL.Clear;
Dm.ZQuery_control_frequencia.SQL.Add('Select * from frequencia where Ano like'+QuotedStr(CBBOX_ano.text+'%'));
Dm.ZQuery_control_frequencia.SQL.Add('and Mes like '+QuotedStr(Edt_mes.text));
Dm.ZQuery_control_frequencia.SQL.Add('and Colaborador like '+QuotedStr(DBLookupCBX_colab.text));
Dm.ZQuery_control_frequencia.SQL.Add('and Tipo like '+QuotedStr(Edit_Folga.text));
Dm.ZQuery_control_frequencia.Open;

Label_Folga.Caption := 'Folga = ' + IntToStr(Dm.ZQuery_control_frequencia.RecordCount);

end;

Essa é a tela do sistema:
[img:descricao=Controle Diário]https://gallery.mailchimp.com/3677b065d74669470fa0f6d88/images/7befa69e-c700-4b3e-984b-b044a8ab81b1.png[/img]
Responder

29/04/2016

Mateus Ribeiro

Você usa MySQL né?

Tente isso:

SELECT F.COLABORADOR,
       (SELECT COUNT(1) FROM FREQUENCIA WHERE TIPO = 'OK' AND ID_COLABORADOR = F.ID_COLABORADOR) PRESENCA,
       (SELECT COUNT(1) FROM FREQUENCIA WHERE TIPO = 'Falta' AND ID_COLABORADOR = F.ID_COLABORADOR) FALTA,
       (SELECT COUNT(1) FROM FREQUENCIA WHERE TIPO = 'Folga' AND ID_COLABORADOR = F.ID_COLABORADOR) FOLGA
  FROM FREQUENCIA F
 WHERE (F.MES ||'-'||F.ANO) = DATE_FORMAT(:pMesAno, '%M-%Y')


Depois só passar por parâmetro assim:
Dm.ZQuery_control_frequencia.Params.ParamByName('pMesAno').Value := '04-2016';


Boa sorte!
Responder

29/04/2016

Fabiano Carvalho

@Marcos P

Count(1) Não conta valores nulos, caso haja.
Responder

29/04/2016

Marcos P

Verdade...

Assim como também não utiliza a estrutura de índices associada a tabela, o que melhora a performance da consulta !

Ou seja, cada caso é um caso...
Responder

29/04/2016

Mauro Monteiro

Boa tarde, Matteusin
Sim, Mysql, ligado no banco pelo componente Zeos ..., agora conectei um ZQuery com o código que o Marcos P passou, ela me retornar perfeitamente os colaboradores e suas frequências na horizontal, muito bom mesmo, pra fechar, eu preciso filtrar pelos campos Mes(INT) e Ano(INT), eles já existem separados na minha tabela, como sou iniciante, estou com dificuldade para chamar com o filtro no Mes (escolhido) e Ano (escolhido) para ter o relatório que me retorna os colaboradores com suas presenças, faltas e folgas.
Responder

29/04/2016

Mauro Monteiro

A Solução seria chamar essa função Sql direto via código no Delphi com os parâmetros para o Mes e Ano, acredito que seja isso, só não sei como!!!
Responder

29/04/2016

Emerson Nascimento

Não sei se funciona no MySQL da forma abaixo, mas é a melhor forma, pois faz a busca apenas uma vez na tabela, em vez de fazer 4 vezes (a select principal + 3 subselects)
SELECT F.COLABORADOR,
	SUM(CASE WHEN TIPO = 'OK' THEN 1 ELSE 0 END) PRESENCA,
	SUM(CASE WHEN TIPO = 'Falta' THEN 1 ELSE 0 END) FALTA,
	SUM(CASE WHEN TIPO = 'Folga' THEN 1 ELSE 0 END) FOLGA
FROM FREQUENCIA F
WHERE (F.MES ||'-'||F.ANO) = DATE_FORMAT(:pMesAno, '%M-%Y')
GROUP BY F.COLABORADOR
Responder

02/05/2016

Mauro Monteiro

Bom dia, galera, venho aqui agradecer a ajuda de todos de coração, consegui fazer da seguinte forma:

no componente Zquery de chamei a função sql, acrescentando os parâmetros para meus campos Mes e Ano:

select 
feq1.Colaborador, 
(select count(1) from frequencia feq2 where feq2.Tipo = 'OK' and feq2.Colaborador = feq1.Colaborador and feq2.Mes = :pMes and feq2.Ano = :pAno) as Presença,
(select count(1) from frequencia feq3 where feq3.Tipo = 'Falta' and feq3.Colaborador = feq1.Colaborador and feq3.Mes = :pMes and feq3.Ano = :pAno) as Falta,
(select count(1) from frequencia feq4 where feq4.Tipo = 'Folga' and feq4.Colaborador = feq1.Colaborador and feq4.Mes = :pMes and feq4.Ano = :pAno) as Folga
from frequencia feq1
group by feq1.tipo;


Em seguida, em um SpeedButton chamei a Sql com os parâmetros para o meu relatório:

begin
Dm.ZQuery_freq_detalhe.Active := false;
DM.ZQuery_freq_detalhe.ParamByName('pMes').Value:=(DBEdit_Mes.Text);
DM.ZQuery_freq_detalhe.ParamByName('pAno').Value:=(DBEdit_Ano.Text);
Dm.ZQuery_freq_detalhe.Open;
end;


Ficou da forma como eu queria!!! Agradeço muito mesmo!!!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar