Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 552625
            [titulo] => Sql - Select count
            [dataCadastro] => DateTime Object
                (
                    [date] => 2016-04-28 17:05:14
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 378439
            [status] => M
            [isExample] => 
            [NomeUsuario] => Marcos P
            [Apelido] => 
            [Foto] => 378439_20140801115452.png
            [Conteudo] => Falta identificar o colaborador nas subqueries...

Adapte a partir de :

[code]
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;
[/code]

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

Sql - Select count

Mauro Monteiro
|
MVP
    28 abr 2016

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 ?:
Retorno do Select  (Clique na imagem para abrir em uma nova janela)
Esse é o Banco:
Banco Frequencia (Clique na imagem para abrir em uma nova janela)
Muito Obrigado!!!

Post mais votado

Marcos P
   - 28 abr 2016

Falta identificar o colaborador nas subqueries...

Adapte a partir de :

#Código

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 !

1
|
0

Mariana Carvalho
   - 28 abr 2016

Acompanhando.

Mateus Ribeiro
   - 28 abr 2016

Boa tarde!

#Código

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

Mauro Monteiro
|
MVP
    29 abr 2016

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:
Controle Diário (Clique na imagem para abrir em uma nova janela)

Mateus Ribeiro
   - 29 abr 2016

Você usa MySQL né?

Tente isso:

#Código

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:
#Código
Dm.ZQuery_control_frequencia.Params.ParamByName('pMesAno').Value := '04-2016';


Boa sorte!

Faabiianooc
   - 29 abr 2016

@Marcos P

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

Marcos P
   - 29 abr 2016

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

Mauro Monteiro
|
MVP
    29 abr 2016

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.

Mauro Monteiro
|
MVP
    29 abr 2016

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!!!

Emerson
   - 29 abr 2016

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)
#Código

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

Mauro Monteiro
|
MVP
    02 mai 2016

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:

#Código

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:

#Código
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!!!