Este SQL funciona muito bem, entretanto, se insiro duas datas para um mesmo funcionario na tabela ele apresenta as duas na minha página jsp.
Eu quero que retorne somente as datas de um determinado mês, por exemplo, mês 01
select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = ‘GEASE’
order by d.nome
Sendo assim, eu estou tentando fazer este SQL utilizando a cláusula EXISTS, mas não está muto fácil. Você pode me ajudar?
Aqui está o que estou tentando fazer:
select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
exists( a.sigla = ‘gease’
and
MONTH(e.dataInicio) = ‘01’
)
Caso eu consiga a resposta através dos meus testes, vou postar assim que consiguir, ok.
Consegui apresentar somente as pessoas que possuem data inicio referente ao mês 01, entretanto, as pessoas que ainda não informaram a data não estão aparecendo, mas elas também devem aparecer no relatório.
ALGUÉM TEM UMA IDÉIA?
select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = ‘gease’
and
MONTH(e.dataInicio) = ‘01’
select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = 'gease'
and
MONTH(e.dataInicio) = '01'
OR
e.dataInicio is null
Mas além disso ele também está apresentando nome de funcionários que não fazem parte da gerencia “gease” solicitada, ou seja, ele está listando todo mundo da tabela
Ele não apresenta datas diferentes para uma mesma pessoa, tal como voce perguntou , entretanto, está listando a tabela inteira com data ou sem data de inicio e fim
Quando eu utilizo este SQL ele me apresenta a tabela logo abaixo, entretanto
com a Eliane C possui duas datas mes 01 e mes 07 para dataInicio.
select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = 'GEASE'
order by d.nome
QUando utilizo este segundo SQL ele apresenta somente dois registros conforme abaixo
select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = ‘gease’
and
MONTH(e.dataInicio) = ‘01’
27887057 Elaine C 2004-01-15 2004-02-10
3878100X Gustavo 004-01-10 2004-02-10
ENTRETANTO, ALÉM desses dois registros eu tenho mais 10 pessoas que fazem parte da “gease”,
mas elas não estão aparecendo na listagem.
meu velho,
repara só…
não existem tabelas que vc esteja relacionando que esteja faltando campos de relacionamento? tipo:
vc tem tal estrutura:
tb_aluno
id
nome
turma
tb_disciplina
id
descricao
tb_nota
aluno_id
disciplina_id
nota
se vc não fizer um sql com todos relacionamentos certos o SGBD fará um produto cartesiano dos registros das tabelas referenciadas.
Exemplo basico:
dados:
TB_ALUNO
1 - MBJUNIOR - A
2 - SANDRO - B
TB_DISCIPLINA
1 - SO
2 - BD
TB_NOTA
1 - 1 - 7,5
1 - 2 - 5
2 - 1 - 8
2 - 2 - 7
SQL que gerará produto cartesiano:
SELECT A.NOME, A.TURMA, D.DESCRICAO, N.NOTA
FROM TB_ALUNO A, TB_DISCIPLINA D, TB_NOTA N
WHERE ( A.ID = N.ALUNO_ID ) AND
( A.TURMA = 'B')
se pode perceber que relacionamentos entre as tabelas estão FALTANDO…
como “D.ID = N.DISCIPLINA_ID”.
e isso fará com que todos cada registro vindo do sql seja “combinado” com todos os registros das tabelas envolvidas no select.
o que irá trazer alunos que pertencem a turma ‘A’ mesmo q não esteja na cláusula de condição.
se não for isso…
tenta usar um DISTINCT.
espero ter ajudado…
Qualquer coisa estamos na área…
QUando utilizo este segundo SQL ele apresenta somente dois registros conforme abaixo
select
d.matricula, d.nome, e.dataInicio, e.dataTermino
from
gerencias a left outer join divisoes b
on
a.pref_gerencia = b.pref_gerencia
left outer join
equipes c
on
b.cod_divisao = c.cod_divisao
left outer join
funcionarios d
on
c.cod_equipe = d.cod_equipe
left outer join
escalaFerias e
on
d.matricula = e.matricula
where
a.sigla = ‘gease’
and
MONTH(e.dataInicio) = ‘01’
27887057 Elaine C 2004-01-15 2004-02-10
3878100X Gustavo 004-01-10 2004-02-10
ENTRETANTO, ALÉM desses dois registros eu tenho mais 10 pessoas que fazem parte da “gease”,
mas elas não estão aparecendo na listagem.
Esse é o meu problema![/quote]
Não sei se entendi exatamente o problema, e provavelmente a esta altura do campeonato vc já deve ter resolvido tb !
Mas pelo o que vi da sua tabela, esses são os dois únicos funcionários que atendem ao critério: “gerencia = ‘grease’ and month = 1”.
Se vc colocar um critério “or isnull” vão aparecer todos da gerência grease:
WHERE
(a.sigla = 'gease')
AND
(MONTH(e.dataInicio) = '01'
OR
is null e.dataInicio);