Query para mostrar Setores e um Count dos funcionarios?

18/08/2004

Olá a todos!
Bom, estou usando MySQL e estou com um probleminha que não estou conseguindo resolver... :´(

Eu tenho as tabelas: [b:ba34fe886c]CadFuncionario[/b:ba34fe886c] e a [b:ba34fe886c]CadSetor[/b:ba34fe886c]. Na tabela CadFuncionario tem o campo [b:ba34fe886c]SETOR[/b:ba34fe886c] que faz referencia ao campo [b:ba34fe886c]Setor_cod[/b:ba34fe886c] (chave primaria) da tabela CadSetor. Tudo isso para indicar a qual setor pertence o funcionário cadastrado.

Até aqui tudo bem... O problema vem a seguir:

Eu quero mostrar na Grid, [b:ba34fe886c]Todos[/b:ba34fe886c] os setores, e uma contagem de quantos funcionários pertencem a este setor. Mas se o setor não tem nenhum funcionário cadastrado, eu queria mostrar a contagem como retornando ZERO, mas o MySQL some com os setores que não tem nenhum funcionário.

Será que fui claro na descrição do problema? A query que eu estava fazendo era essa:

select 
   *, count( CadFuncionario.setor ) as TotFuncionarios

from 
   CadSetor, CadFuncionario

where
   Setor_cod = setor

group by 
   CadFuncionario.setor


Alguem tem alguma idéia de como eu deveria proceder neste caso?
Obrigado!


Nildo

Respostas

18/08/2004

Vinicius2k

nildo,

Eu estou sem uma base com a mesma lógica da sua para testar agora, mas *eu acho´ que o problema está no Group By... faça um teste agrupando por Cad_Setor.Setor_Cod...

Perdõe-me se não for isso :roll:

T+
Vina.


Responder Citar

18/08/2004

Nildo

nildo, Eu estou sem uma base com a mesma lógica da sua para testar agora, mas *eu acho´ que o problema está no Group By... faça um teste agrupando por Cad_Setor.Setor_Cod... Perdõe-me se não for isso :roll: T+ Vina.


Cai na mesma... :´(


Responder Citar

18/08/2004

Cabelo

Isto aconteceu comigo quando estava utilizando o SQL Server..

Não consegui resolver o problema com SQL, parti para o Delphi..

Dei um Select distinct na Tabela principal(Setor), fiz um while e fui adicionando a um ClientDataSet os resultados, se o count não retornar nada (isnull), coloco zero..

:oops: (é gambiarra, mas funciona legal) :lol:

espero ter ajudado..

Cabelo


Responder Citar

18/08/2004

Emerson

o problema está na forma como foi feita a instrução. da forma que está, foi feito um INNER JOIN, que significa que só serão mostrados valores que estejam em ambas tabelas.

tente assim:
select *, count( CF.Setor ) as TotFuncionarios
from CadSetor CS
    left join CadFuncionario CF on (CF.Setor = CS.Setor_Cod)
group by
    CF.Setor

acho que assim funciona.


Responder Citar

18/08/2004

Emerson

se isso não der certo, tente com subselects:

select *,
    (select count(Setor) from CadFuncionario where Setor=CadSetores.Setor_Cod) as TotFuncionarios
from
    CadSetores
order by
    Setor_Cod


Responder Citar

18/08/2004

Nildo

Postando os resultados:

[b:af31b14b0f]Cabelo_uni[/b:af31b14b0f] - se eu realmente não conseguir utilizando queries eu vou partir para as gambiarras :oops: afinal... o que é um programador sem gambiarras? :lol:

[b:af31b14b0f]emerson.en (primeira solução)[/b:af31b14b0f] - A tabela de setor tinham 3 registros. Sua query me retornou apenas 1 (o primeiro), e o Count me retornou 3. Mas existem uns 140 funcionários cadastrados.

[b:af31b14b0f]emerson.en (segunda solução)[/b:af31b14b0f] - Acho que o MySQL não aceita sub-select. Retorna erro perto de [i:af31b14b0f]´select count(Setor) from CadFuncionario ´[/i:af31b14b0f]

Mais alguma dica? Não quero partir para as gambiarras :oops:


Responder Citar

18/08/2004

Rômulo Barros

Primeira solução:

...
Having count(CadFuncionario.setor) > 0
...


Segunda solução:

No Oracle, temos a function AVL que nos traz ´0(zero)´ quando um registro possui valor nulo.

:arrow: :arrow: :arrow:


Responder Citar

18/08/2004

Rômulo Barros

Ou ainda:

SELECT S.*,(SELECT COUNT(F.SETOR) FROM FUNCIONARIOS F WHERE F.SETOR = S.SETOR)AS QTD
FROM SETORES S
WHERE QTD > 0



Responder Citar

18/08/2004

Nildo

Undeclared Identifier:
Primeiramente obrigado!

Como ficaria sua primeira solução em minha query? Estou meio perdido em como implementá-lo.

na segunda solução, o MySQL não aceita sub-selects, logo não funciona.


Responder Citar

18/08/2004

Emerson

veja se esse artigo te ajuda:

[url]http://www.bitmechanic.com/mail-archives/mysql/current/2149.html[/url]


Responder Citar

18/08/2004

Nildo

veja se esse artigo te ajuda: [url]http://www.bitmechanic.com/mail-archives/mysql/current/2149.html[/url]


Hummm! Legal, gostei! mas...
Volto a meu problema... Se não houver nenhum funcionário para um determinado Setor, aquele meu select não vai retornar o Setor, mas eu queria que me retornasse aquele setor, com o Count sendo ZERO


Responder Citar

18/08/2004

Emerson

1. When tr.pcode is not indexed:

SELECT tp.pcode, IF(ISNULL(tr.pcode), 0, COUNT(*)) AS count
FROM tp
LEFT JOIN tr ON tp.pcode = tr.pcode
GROUP BY tp.pcode;

+---------+-------+
| pcode | count |
+---------+-------+
| kvw2000 | 28 |
| kvw2001 | 0 |
+---------+-------+ (as expected)


segundo o artigo, [b:3d39eb323d]seu campo Setor não pode estar indexado[/b:3d39eb323d], e o código deveria ser:

Select CS.Setor_Cod, If( IsNull(CF.Setor),0,Count(*) ) as TotFuncionarios
from CadSetores CS
left join CadFuncionarios CF on CS.Setor_Cod = CF.Setor
group by CS.Setor_Cod


Responder Citar

18/08/2004

Nildo

Puuuutzz!!! Funcionou Emerson!!!
Poxa, valew mesmo!!!

Muito obrigado!
Muito obrigado a você e a todos que me ajudaram!!! Valewsssss!!! :D :D :D


Responder Citar