Sql - Select count
28/04/2016
0
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
Post mais votado
28/04/2016
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
Mais Posts
28/04/2016
Mateus Ribeiro
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
29/04/2016
Mauro Monteiro
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]
29/04/2016
Mateus Ribeiro
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!
29/04/2016
Fabiano Carvalho
Count(1) Não conta valores nulos, caso haja.
29/04/2016
Marcos P
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...
29/04/2016
Mauro Monteiro
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.
29/04/2016
Mauro Monteiro
29/04/2016
Emerson Nascimento
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
02/05/2016
Mauro Monteiro
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!!!
Clique aqui para fazer login e interagir na Comunidade :)