Array
(
)

Problema em consulta SQL

Leandro Gomes
   - 25 nov 2013

Pessoal, boa tarde
Tenho a seguinte situação aqui na minha empresa.
A tabela PESSOA armazena os dados cadastrais da pessoa que entra na empresa.
Ao ser admitido ela usa os dados da tabela PESSOA para preencher a tabela FUNC, onde CODPESSOA é FK da tabela pessoa e CHAPA é PK da tabela FUNC.
Tenho uma tabela no sistema que armazena resultado de uma avaliação, essa tabela identifica o avaliado pelo CODPESSOA que vem da tabela PESSOA, porem existe uma regra no sistema que quando o funcionário troca de seção sua situação passa para DEMITIDO e é gerado uma nova CHAPA para ele, porem com o mesmo código PESSOA.
Tenho o seguinte problema, tenho que fazer uma consulta SQL que retorne todas as pessoas que participaram da avaliação, mas quando eu faço a consulta ela retorna todas as pessoas inclusive as demitidas, e em alguns casos ela duplica o resultado trazendo a pessoa que foi demitida e a que está ativo, pelo fato do CODPESSOA ser igual. Meu problema é que não posso colocar uma clausula where onde SITUACAO seja <> demitido, porque pode haver casos que a pessoa foi demitida e fez a avaliação e a consulta tem que retornar essa pessoa.
Exemplo, nas tabelas exemplo abaixo ele retornaria a funcionária Isabela duas vezes porque na tabela FUNC o código pessoa está repetido e uma chapa está demitida e outra ativa
Minha pergunta é tem como eu trazer todos as pessoas inclusive as demitidas sem retornar dados repetidos
Tentei ser o mais claro possível se alguém conseguir me ajudar, obrigado a todos
Ex. das tabelas
TABELA - PESSOA
CODPESSOA NOME
1 ISABELA ARAUJO
2 LUIZ CARLOS
3 ANTONIO CARLOS
TABELA - FUNC
CODPESSOA CHAPA NOME SECAO SITUACAO
1 000001 ISABELA ARAUJO 01 DEMITIDO
2 000123 LUIZ CARLOS 01 ATIVO
1 000002 ISABELA ARAUJO 02 ATIVO
3 000054 ANTONIO CARLOS 01 DEMITIDO

TABELA - ZAVALIACAO
CODAVALIADO CODAVALIADOR CODAVALIACAO RESULTADO
1 2 2012.1 10
3 2 2012.1 8

Isaac Jose
   - 25 nov 2013

select distinct campoa,campob etc
from producao.Tb_teste a

Leandro Gomes
   - 25 nov 2013

Já tentei com a clausula distinct e não funciona.

Alex Lekao
   - 25 nov 2013

Oi Leandro, boa tarde!!!

Cara eu ja li varias vezes o que vc escreveu e nao to conseguindo entender bem, acredito que vc foi claro sim, e a dificuldade seja minha.

Posta o seu script para a gente analisar junto e ver o que conseguimos ajudar.

Faz um teste com o Distinct que o Isaac sugere e vamos ver se resolve.

Abraco.

Alex - Lekao

Leandro Gomes
   - 25 nov 2013

Boa tarde Alex,

A consulta é bem complexa verifica se você consegue entender.

DECLARE @AVALIACAO VARCHAR(20)

SET @AVALIACAO = '2012.2'

SELECT DISTINCT
PFUNC.NOME,
PSECAO.DESCRICAO AS 'UNIDADE',
PFUNCAO.CODIGO AS 'E.O',
ISNULL(VFAIXASALARIAL.NOMEFAIXA,'') AS 'STEP' ,
ISNULL(ZQUESTAOPARTICIPANTE.CODAVALIACAO, '') AS 'CODAVALIACAO',
ISNULL(ZTIPOCOMPETENCIA.DESCRICAO, '') AS 'TIPOS DE COMPETÊNCIAS',
ISNULL(CAST((ZQUESTAO.DESCRICAO) AS VARCHAR(1000)), '') AS 'COMPETÊNCIAS',
ZQUESTAOPARTICIPANTE.IDQUESTAO,
ISNULL(AUTOAVALIACAO.RESPOSTA,'') AS 'AUTO-AVALIACAO',
ISNULL(AVALIACAOSUPERIOR.RESPOSTA, '') AS 'AVALIACAO DO SUPERIOR',
ISNULL(COMITEREAVALIACAO.RESPOSTA,'') AS 'COMITE DE REAVALIAÇÃO',
ISNULL(AJUSTEDIRPOSCOMITE.RESPOSTA, '') AS 'AJUSTE DIRETORIA - PÓS COMITÊ',
ISNULL(COMITEREVISAO.RESPOSTA, '') AS 'COMITÊ DE REVISÃO',
ISNULL(AJUSTEDIRPOSREVISAO.RESPOSTA, '') AS 'AJUSTE DIRETORIA - PÓS REVISÃO' ,
1 QUEBRA

FROM
ZQUESTAOPARTICIPANTE (NOLOCK)

INNER JOIN PFUNC (NOLOCK)
ON ZQUESTAOPARTICIPANTE.CODAVALIADO = PFUNC.CODPESSOA
AND ZQUESTAOPARTICIPANTE.CODCOLIGADA = PFUNC.CODCOLIGADA

INNER JOIN PFUNCAO (NOLOCK)
ON PFUNC.CODFUNCAO = PFUNCAO.CODIGO
AND PFUNCAO.CODCOLIGADA = PFUNC.CODCOLIGADA
AND PFUNCAO.INATIVA = 0

LEFT JOIN VFAIXASALARIAL (NOLOCK)
ON PFUNC.CODCOLIGADA = VFAIXASALARIAL.CODCOLIGADA
AND PFUNC.GRUPOSALARIAL = VFAIXASALARIAL.CODFAIXA

INNER JOIN ZQUESTAO (NOLOCK)
ON ZQUESTAOPARTICIPANTE.IDQUESTAO = ZQUESTAO.IDQUESTAO
AND ZQUESTAOPARTICIPANTE.CODAVALIACAO = ZQUESTAO.CODAVALIACAO

INNER JOIN PSECAO (NOLOCK)
ON PFUNC.CODSECAO = PSECAO.CODIGO
AND PFUNC.CODCOLIGADA = PSECAO.CODCOLIGADA

INNER JOIN ZRESULTAVALIACAO (NOLOCK)
ON ZRESULTAVALIACAO.CODAVALIACAO = ZQUESTAOPARTICIPANTE.CODAVALIACAO
AND ZRESULTAVALIACAO.CODAVALIADO = ZQUESTAOPARTICIPANTE.CODAVALIADO
AND ZRESULTAVALIACAO.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA

INNER JOIN ZCOMPETENCIA (NOLOCK)
ON ZQUESTAO.CODCOMPETENCIA = ZCOMPETENCIA.CODCOMPETENCIA
AND ZQUESTAO.CODCOLIGADA = ZCOMPETENCIA.CODCOLIGADA

INNER JOIN ZTIPOCOMPETENCIA (NOLOCK)
ON ZCOMPETENCIA.CODTIPOCOMPETENCIA = ZTIPOCOMPETENCIA.CODIGO
AND ZCOMPETENCIA.CODCOLIGADA = ZTIPOCOMPETENCIA.CODCOLIGADA

LEFT JOIN (SELECT
CODCOLIGADA,CODAVALIADO,
CODAVALIADOR,IDQUESTAO,
RESPOSTA, NOTA, CODAVALIACAO
FROM ZQUESTAOPARTICIPANTE
WHERE ZQUESTAOPARTICIPANTE.CODAVALIADO = ZQUESTAOPARTICIPANTE.CODAVALIADOR)AS AUTOAVALIACAO
ON AUTOAVALIACAO.CODAVALIADO = PFUNC.CODPESSOA
AND AUTOAVALIACAO.IDQUESTAO = ZQUESTAOPARTICIPANTE.IDQUESTAO
AND AUTOAVALIACAO.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND AUTOAVALIACAO.CODAVALIACAO= ZQUESTAOPARTICIPANTE.CODAVALIACAO

LEFT JOIN (
SELECT
ZQUESTAOPARTICIPANTE.CODCOLIGADA,
ZQUESTAOPARTICIPANTE.CODAVALIADO,
ZQUESTAOPARTICIPANTE.CODAVALIADOR,
ZQUESTAOPARTICIPANTE.IDQUESTAO,
ZQUESTAOPARTICIPANTE.RESPOSTA,
ZQUESTAOPARTICIPANTE.NOTA,
ZQUESTAOPARTICIPANTE.CODAVALIACAO,
ZCOMPETENCIA.CODTIPOCOMPETENCIA,
ZPARTICIPANTES.TIPOAVALIADOR
FROM ZQUESTAOPARTICIPANTE

INNER JOIN ZQUESTAO
ON ZQUESTAO.IDQUESTAO = ZQUESTAOPARTICIPANTE.IDQUESTAO
AND ZQUESTAO.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND ZQUESTAO.CODAVALIACAO = ZQUESTAOPARTICIPANTE.CODAVALIACAO

INNER JOIN ZCOMPETENCIA
ON ZCOMPETENCIA.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND ZCOMPETENCIA.CODCOMPETENCIA = ZQUESTAO.CODCOMPETENCIA

INNER JOIN ZPARTICIPANTES
ON ZPARTICIPANTES.CODAVALIACAO = ZQUESTAOPARTICIPANTE.CODAVALIACAO
AND ZPARTICIPANTES.CODAVALIADO = ZQUESTAOPARTICIPANTE.CODAVALIADO
AND ZPARTICIPANTES.CODAVALIADOR = ZQUESTAOPARTICIPANTE.CODAVALIADOR
AND ZPARTICIPANTES.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND ZPARTICIPANTES.TIPOAVALIADOR = '8'

WHERE ZQUESTAOPARTICIPANTE.CODAVALIADO <> ZQUESTAOPARTICIPANTE.CODAVALIADOR
AND CASE
WHEN (ZCOMPETENCIA.CODTIPOCOMPETENCIA = 'R' AND ZPARTICIPANTES.TIPOAVALIADOR = '3')
OR (ZCOMPETENCIA.CODTIPOCOMPETENCIA = 'C' AND ZPARTICIPANTES.TIPOAVALIADOR = '3')
OR (ZCOMPETENCIA.CODTIPOCOMPETENCIA = 'A' AND ZPARTICIPANTES.TIPOAVALIADOR = '3')
THEN 1
ELSE 0
END <> 1
)AS AVALIACAOSUPERIOR

ON AVALIACAOSUPERIOR.CODAVALIADO = PFUNC.CODPESSOA
AND AVALIACAOSUPERIOR.IDQUESTAO = ZQUESTAOPARTICIPANTE.IDQUESTAO
AND AVALIACAOSUPERIOR.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND AVALIACAOSUPERIOR.CODAVALIACAO = ZQUESTAOPARTICIPANTE.CODAVALIACAO

LEFT JOIN (SELECT
CODCOLIGADA,CODAVALIACAO,
CODAVALIADO, IDQUESTAO,
RESPOSTA, NOTA
FROM ZITEMCOMITE
WHERE TIPOCOMITE = '1')AS COMITEREAVALIACAO
ON COMITEREAVALIACAO.CODAVALIACAO = ZQUESTAOPARTICIPANTE.CODAVALIACAO
AND COMITEREAVALIACAO.CODAVALIADO = ZQUESTAOPARTICIPANTE.CODAVALIADO
AND COMITEREAVALIACAO.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND COMITEREAVALIACAO.IDQUESTAO = ZQUESTAOPARTICIPANTE.IDQUESTAO

LEFT JOIN (SELECT
CODCOLIGADA, CODAVALIACAO,
CODAVALIADO, IDQUESTAO,
RESPOSTA, NOTA
FROM ZITEMAJUSTE
WHERE TIPOAJUSTE = '1') AS AJUSTEDIRPOSCOMITE

ON AJUSTEDIRPOSCOMITE.CODAVALIACAO = ZQUESTAOPARTICIPANTE.CODAVALIACAO
AND AJUSTEDIRPOSCOMITE.CODAVALIADO = ZQUESTAOPARTICIPANTE.CODAVALIADO
AND AJUSTEDIRPOSCOMITE.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND AJUSTEDIRPOSCOMITE.IDQUESTAO = ZQUESTAOPARTICIPANTE.IDQUESTAO

LEFT JOIN (SELECT
CODCOLIGADA,CODAVALIACAO,
CODAVALIADO, IDQUESTAO,
RESPOSTA, NOTA
FROM ZITEMCOMITE
WHERE TIPOCOMITE = '2')AS COMITEREVISAO
ON COMITEREVISAO.CODAVALIACAO = ZQUESTAOPARTICIPANTE.CODAVALIACAO
AND COMITEREVISAO.CODAVALIADO = ZQUESTAOPARTICIPANTE.CODAVALIADO
AND COMITEREVISAO.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND COMITEREVISAO.IDQUESTAO = ZQUESTAOPARTICIPANTE.IDQUESTAO

LEFT JOIN (SELECT
CODCOLIGADA, CODAVALIACAO,
CODAVALIADO, IDQUESTAO,
RESPOSTA, NOTA
FROM ZITEMAJUSTE
WHERE TIPOAJUSTE = '2') AS AJUSTEDIRPOSREVISAO

ON AJUSTEDIRPOSREVISAO.CODAVALIACAO = ZQUESTAOPARTICIPANTE.CODAVALIACAO
AND AJUSTEDIRPOSREVISAO.CODAVALIADO = ZQUESTAOPARTICIPANTE.CODAVALIADO
AND AJUSTEDIRPOSREVISAO.CODCOLIGADA = ZQUESTAOPARTICIPANTE.CODCOLIGADA
AND AJUSTEDIRPOSREVISAO.IDQUESTAO = ZQUESTAOPARTICIPANTE.IDQUESTAO

WHERE ZQUESTAOPARTICIPANTE.CODAVALIACAO = @AVALIACAO

GROUP BY
PSECAO.DESCRICAO,
PFUNC.NOME,
PFUNCAO.CODIGO,
ISNULL(VFAIXASALARIAL.NOMEFAIXA,''),
ISNULL(ZQUESTAOPARTICIPANTE.CODAVALIACAO,''),
ISNULL(ZTIPOCOMPETENCIA.DESCRICAO, ''),
ZQUESTAOPARTICIPANTE.IDQUESTAO,
ISNULL(AUTOAVALIACAO.RESPOSTA,''),
ISNULL(AVALIACAOSUPERIOR.RESPOSTA, ''),
ISNULL(COMITEREAVALIACAO.RESPOSTA,''),
ISNULL(AJUSTEDIRPOSCOMITE.RESPOSTA, ''),
ISNULL(COMITEREVISAO.RESPOSTA, ''),
ISNULL(AJUSTEDIRPOSREVISAO.RESPOSTA, ''),
CAST((ZQUESTAO.DESCRICAO) AS VARCHAR(1000))

Isaac Jose
   - 25 nov 2013

boa tarde amigo..
pq nao cria uma table de historico,, onde deixa guardado o nome dos funcionarios e os departamentos em que trabalharam com o periodo inicial e final de cada um?
dessa maneira que esta gera redundancia..
agora estou indo embora mais a noite dou uma olhada. e tento ver algo que possa te ajudar..

Alex Lekao
   - 25 nov 2013

Oi Leandro,

Nao consegui analisar bem o que vc postou, muita correria aqui no trabalho.

Vi que esta com o Distinct, nao funcionou assim?

percebi tambem inumeras juncoes, pode ser que o desempenho fique prejudicado.

Uma sugestao seria essa tabela que o Issac sugeriu, ou entao vc montar uma view com esse script que vc esta usando atualmente e montar o scrip fazendo o filtro adequado em cima da view, pode ser interessante tbm.

QQr coisa depois tantamos ver o que conseguimos fazer melhor, nao consegui mesmo analisar seu conteudo.

Vou ver se amanha consigo criar uma estrutura de tabela para tentar simular o seu caso e o seu script.

vamos ver se conseguimos resolver isso ae, com certeza ira ter uma solucao legal para essa questao.

Abraco.

Alex - Lekao

Leandro Gomes
   - 26 nov 2013

Bom dia Alex,

Obrigado pela ajuda de todos.

Sim coloquei o DISTINCT não resolveu nada. Esse é usado para gerar um cubo de decisão.

A sugestão do Isaac de criar uma tabela resolveria o problema, na verdade, já existe uma tabela de histório, mas so armazena a data da alteração que não ajuda muito.

Tem dois que estou quebrando a cabeça para resolver esse problema e ainda não achei uma solução.

Isaac Jose
   - 26 nov 2013

entao menos. mal...

se tem a data de alteração deve ter algura referecia com o usuario certo?
add os novos campos faça a atualização e veja se funciona....
pelo menos ficaria no minimo mais performatico e mais amigavel..
um codigo para retornar os cursos que um funcionario ativo ou nao na empresa fizeram nao poderiam dar mais que 5 linhas de codigo :(.

espero que resolva..
abraços

Alex Lekao
   - 26 nov 2013

Oi Leandro, bom dia!!!

Essa noite estive pensando na sua questao e pensei no seguinte, deve ser menos performatico mas talvez consiga resolver o problema.

esperimente mudar o codigo para o Seguinte:

#Código
select
Lista de campos nomeados no seu script atual
from (
seu script atual
) as nome qqr
where condicionais necessarias.


nao sei se esta claro.

mas assim ficara como se vc tivesse criado uma tabela temporaria, nao lembro como se chama isso no sql.... rsrsr, e vc manipula normalmente como se estivesse usando a view que sugeri ou outra tabela qqr.

Talvez com isso vc consiga fazer o tratamento que precisa e chegar ao resultado que precisa.

Nao sei se me fiz entender... rsrsr

Espero que ajude.

Abraco.

Alex - Lekao

Leandro Gomes
   - 27 nov 2013

Pessoal, boa tarde

Consegui resolver o problema. Na tabela de Avaliação tem uma data ref. a resposta do usuario na avaliação, fiz uma clausula where considerando a data das respostas que estavam dentro do periodo de admissão do funcionario e funcionou.

Obrigado pela ajuda.

Abraços

Alex Lekao
   - 27 nov 2013

blz...

obrigado.