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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar