CONSULTA EM DUAS TABELAS

ARCADYUM 14/02/2010 12:19:09
#334381
Pessoal,
Estou precisando de um código que realize as seguintes consultas:
Tenho duas tabelas.
Uma registra uma situação inicial e chama tabela_situacao
a segunda registra as movimentações da tabela_situacao

São documentos que entram no setor e a cada movimentação que o documento sofre precisa ser registrado
Ocorre que devido ao grande volume de documento nem todos sofre modificação, então gostaria de um código que realizasse a seguinte consulta
retornar somente os registros que não coincidam na tabela_movimentação. Segue Exemplo:

tabela_situação

codigo numero situacao
1 1 análise
2 2 análise
3 3 análise

tabela_movimentacçao

codigo numero situacao
1 1 saida
2 1 entrada
3 3 saida
3 3 entrada
3 3 saida

Conforme a demonstração o único registro que não se encontra na tabela_movimentação e o numero 2. Então a consulta teria que retornar o número 2
Gostaria que me ajudassem também em outro código que pudesse me retornar os números que se encontram em cada situação na tabela_movimentação , ou seja os números que se encontram na situação entrada e os números que se encontram na situação saída.
Desde já agradeço pela atenção


Conforme a descricão








DANIKULL 15/02/2010 20:11:39
#334444
Resposta escolhida
ARCADYUM, boa noite.

Respoondendo a sua Primeira pergunta, segue a consulta:

SELECT tabela_situacao.numero, tabela_situacao.situacao
FROM tabela_situacao LEFT JOIN tabela_movimentacao ON (tabela_movimentacao.numero = tabela_situacao.numero)
WHERE tabela_movimentacao.numero IS NULL;


Respondendo a sua segunda pergunta sege, bom pelo menios o que eu intendi:

SELECT tabela_movimentacao.Numero, tabela_movimentacao.Numero
FROM tabela_movimentacao
WHERE (((tabela_movimentacao.Situacao)=[txt-color=#e80000][Ô]Entrada[Ô][/txt-color]))
GROUP BY tabela_movimentacao.Numero;


Onde está marcado, basta você alterar para Saida que vai saber os itens com situação saida, ok???

Qualquer coisa posta ai de novo.

Abraços.....

ARCADYUM 16/02/2010 02:10:26
#334463
Dankul,
Em primeiro lugar obrigado pela atenção. A resposta da primeira pergunta satisfez a necessidade. Quanto a segunda me expressei mal, ocorre o seguinte:

tem outros campos na tabela_situação que preciso dos valores para montar essa consulta, mas suponha que seja um campo de nome valor. o campo valor não repete na tabela_movimentação. A consulta deve retornar os valores da ultima posição de cada número cadastrado. Vamos supor que eu deseje retornar uma consulta com todos os números que esteja na posição saída. Conforme a descrição da tabela acima a consulta teria que me retornar o seguinte resultado.

número valor posição
3 100,00 saida (Conforme demonstrado a ultima posição do 3 é saída ignorando a saída inicial) ( Outro detalhe é que na tabela_movimentaçã o campo código é sequencial e não como está descrito, ou seja a última posição teria que ser código 5)

Vamos supor que eu deseje retornar uma consulta com todos os números que esteja na posição entrada. Conforme a descrição da tabela acima a consulta teria que me retornar o seguinte resultado.

número valor posição
2 150,00 entrada

Bem espero ter sido mais claro dessa vez e se puder me ajudar nessa empreitada ficarei grato.
Um Abraço
Até mais
DANIKULL 17/02/2010 13:06:17
#334575
ARCADYUM, boa tarde.

Respondendo a sua questão 1:

SELECT DISTINCT tabela_movimentacao.Numero, Last(tabela_movimentacao.Situacao) AS Situacao, Last(tabela_movimentacao.Valor) AS Valor
FROM tabela_movimentacao LEFT JOIN tabela_situacao ON tabela_movimentacao.Numero = tabela_situacao.Numero
GROUP BY tabela_movimentacao.Numero;


Quantio a sua questão 2:

é a 2º. Resposta do tópico anterior, a única diferença foi acrescentar o campo valor:

SELECT tabela_movimentacao.Numero, tabela_movimentacao.Situacao, tabela_movimentacao.Valor
FROM tabela_movimentacao
WHERE tabela_movimentacao.Situacao=[Ô][txt-color=#e80000]Entrada[/txt-color][Ô];


E para você saber quais estão na posição Saída, mude o texto grifado para Saida, ok??

Testai e qualquer coisa poste novamente.

ARCADYUM 17/02/2010 15:21:05
#334596
Dankul,
Obrigado pela atenção mais uma vez. Acho que estamos chegando ao que necessito. Vou postar novamente as tabelas conforme são estruturadas e explicar novamente, pois não conseguir adaptar nenhum dos códigos que você postou: Segue relação:

TABELA_SITUACAO

CODIGO NUMERO NOME OBJETO VALOR POSICAO
1 1 TESTE TESTANDO 100 ATIVO
2 2 TESTE1 TESTANDO 200 ATIVO
3 3 TESTE2 TESTANDO 50 ATIVO
4 4 TESTE3 TESTANDO 40 ATIVO
5 5 TESTE4 TESTANDO 20 ATIVO
6 6 TESTE5 TESTANDO 10 ATIVO

TABELA_MOVIMENTACAO

CODIGO NUMERO POSICAO
1 1 ANÁLISE
2 1 SAÍDA
3 1 ENTRADA
4 2 ANÁLISE
5 2 SAÍDA
6 2 ENTRADA
7 2 SAÍDA
8 3 ANÁLISE
9 3 SAÍDA
10 3 ENTRADA
11 4 ANÁLISE
12 4 SAÍDA
13 4 ENTRADA
14 4 SAÍDA
15 4 ENTRADA
16 5 ANÁLISE
17 5 SAÍDA
18 5 ENTRADA
19 6 ANÁLISE
20 6 SAÍDA

Nesta situação, caso eu queira uma consulta que retorne uma situação que esteja na posição de Análise a consulta deverá retornar os seguintes campos


NUMERO NOME OBJETO VALOR
1 TESTE TESTANDO 100

Nesta situação, caso eu queira uma consulta que retorne uma situação que esteja na posição de Saída a consulta deverá retornar os seguintes campos:

NUMERO NOME OBJETO VALOR
2 TESTE1 TESTANDO 200
6 TESTE5 TESTANDO 10

Nesta situação, caso eu queira uma consulta que retorne uma situação que esteja na posição de Entrada a consulta deverá retornar os seguintes campos:

NUMERO NOME OBJETO VALOR
3 TESTE2 TESTANDO 50
4 TESTE3 TESTANDO 40
5 TESTE4 TESTANDO 20


Bem como pode ver a consulta só utiliza as condições da Tabela_movimentação porém demonstra os dados cadastrados na Tabela_Situação

Se puder me ajudar ficarei agradecido.
Até
DANIKULL 17/02/2010 22:45:46
#334640
ARCADYUM, boa noite,

Voltando ao Início, suge reformulação das consultas conf. Estrutra passada:

1º. Consulta - Primeira solicitação:
Registros não encontrado na tabela movimentação mas existete na tabela situação

SELECT TABELA_SITUACAO.Numero, TABELA_SITUACAO.Objeto, TABELA_SITUACAO.Valor
FROM TABELA_SITUACAO LEFT JOIN TABELA_MOVIMENTACAO ON TABELA_SITUACAO.Numero = TABELA_MOVIMENTACAO.Numero
WHERE (((TABELA_MOVIMENTACAO.Numero) Is Null));


2º. Consulta - Segunda solicitação:
Ultima movimentação de cada Número da tabela Situação na tabela Movimentação
SELECT TABELA_SITUACAO.Numero, TABELA_SITUACAO.Objeto, Last(TABELA_MOVIMENTACAO.Posicao) AS ÚltimoDePosicao, TABELA_SITUACAO.Valor, TABELA_MOVIMENTACAO.Numero
FROM TABELA_MOVIMENTACAO LEFT JOIN TABELA_SITUACAO ON TABELA_MOVIMENTACAO.Numero=TABELA_SITUACAO.Numero
GROUP BY TABELA_SITUACAO.Numero, TABELA_SITUACAO.Objeto, TABELA_SITUACAO.Valor, TABELA_MOVIMENTACAO.Numero;


3º. Consulta - Posição de Análise:
SELECT TABELA_SITUACAO.Numero, TABELA_SITUACAO.Nome, TABELA_SITUACAO.Objeto, TABELA_SITUACAO.Valor
FROM TABELA_MOVIMENTACAO INNER JOIN TABELA_SITUACAO ON TABELA_MOVIMENTACAO.Numero = TABELA_SITUACAO.Numero
WHERE (((TABELA_MOVIMENTACAO.Posicao)=[Ô]Analise[Ô]));


4º. Consulta - Posição de Saída:
SELECT TABELA_SITUACAO.Numero, TABELA_SITUACAO.Nome, TABELA_SITUACAO.Objeto, TABELA_SITUACAO.Valor
FROM TABELA_MOVIMENTACAO INNER JOIN TABELA_SITUACAO ON TABELA_MOVIMENTACAO.Numero = TABELA_SITUACAO.Numero
WHERE (((TABELA_MOVIMENTACAO.Posicao)=[Ô]Saida[Ô]));


5º. Consulta - Posição de Entrada:
SELECT TABELA_SITUACAO.Numero, TABELA_SITUACAO.Nome, TABELA_SITUACAO.Objeto, TABELA_SITUACAO.Valor
FROM TABELA_MOVIMENTACAO INNER JOIN TABELA_SITUACAO ON TABELA_MOVIMENTACAO.Numero = TABELA_SITUACAO.Numero
WHERE (((TABELA_MOVIMENTACAO.Posicao)=[Ô]Entrada[Ô]));


Pelo que eu entendi é isto.

Qualquer coisa posta ai de novo, ok???
ARCADYUM 18/02/2010 09:53:07
#334659
Dankul,
Tentei adaptar o segundo para minha necessidade porém não deu certo. Veja o que falta no código por favor:

[Ô]SELECT TABELA_SITUACAO.NUMERO, TABELA_SITUACAO.NOME, TABELA_SITUACAO.OBJETO, TABELA_SITUACAO.VALOR, LAST(TABELA_MOVIMENTACAO.POSICAO) AS ÚltimoDePosicao, TABELA_MOVIMENTACAO.NUMERO [Ô] & _
[Ô]FROM TABELA_MOVIMENTACAO LEFT JOIN TABELA_SITUACAO ON TABELA_MOVIMENTACAO.NUMERO = TABELA_SITUACAO.NUMERO [Ô] & _
[Ô]GROUP BY TABELA_SITUACAO.NUMERO , TABELA_SITUACAO.NOME, TABELA_SITUACAO.OBJETO, TABELA_SITUACAO.VALOR, TABELA_MOVIMENTACAO.NUMERO HAVING ÚltimoDePosicao =[ô][Ô] & COMPARADOR & [Ô][ô][Ô]

Entenda COMPARADOR como uma variável passada como referência. O código original funciona, ou seja, busca sempre a última posição de cada número, porém, tem como filtrar essa consulta conforme o critério da variável , se sim , como seria?

Aguardando respostas
Arcadyum
DANIKULL 18/02/2010 10:57:16
#334672
ARCADYUM, bom dia.

Coloque o HAVING antes do GROUP BY e se a variável COMPARADOR for dio tipo texto coloque sempre aspas simples:

[Ô]SELECT TABELA_SITUACAO.NUMERO, TABELA_SITUACAO.NOME, TABELA_SITUACAO.OBJETO, TABELA_SITUACAO.VALOR, LAST(TABELA_MOVIMENTACAO.POSICAO) AS ÚltimoDePosicao, TABELA_MOVIMENTACAO.NUMERO [Ô] & _
[Ô]FROM TABELA_MOVIMENTACAO LEFT JOIN TABELA_SITUACAO ON TABELA_MOVIMENTACAO.NUMERO = TABELA_SITUACAO.NUMERO [Ô] & _
[Ô]HAVING ÚltimoDePosicao = [ô][Ô] & COMPARADOR & [Ô][ô][Ô] & _
[Ô]GROUP BY TABELA_SITUACAO.NUMERO , TABELA_SITUACAO.NOME, TABELA_SITUACAO.OBJETO, TABELA_SITUACAO.VALOR, TABELA_MOVIMENTACAO.NUMERO[Ô]


Veja ai se vai funcionar, ok??
ARCADYUM 18/02/2010 11:14:14
#334679
Dankul,
Obrigado pela atenção e pelo seu tempo. Espero um dia poder ajudar assim como você. A consulta funcionou como esperado. Vou encerrar o tópico, mas fica meus sinceros agradecimentos.
Um Abraço e até a próxima.
Arcadyum.
Tópico encerrado , respostas não são mais permitidas