CONSULTA COM VARIOS REGISTROS PRIORIZADOS

OSVALDO.ORODRIG 21/01/2010 11:46:01
#332480
Ola,

Estou fazendo uma consulta em duas tabelas: clientes e endereços. Na base certos clientes possuem apenas o endereço comercial, alguns apenas o de correspondencia, alguns apenas o residencial e outros tem comercial e residencial ou comercial e correspondencia ou correspondencia e residencial. Como consigo listar todos os clientes que possuem apenas endereço de correspondencia, ou apenas endereço comercial ou apenas endereço residencial. Se o cliente tiver mais de um endereço, gostaria de mostrar na ordem, apenas o de correspondencia, senão tiver esse mostra o comercial e se tambémn não tiver o comercial ai exibe o residencial.
As tabelas estão assim:

Clientes
ClienteID - Código do cliente
ClienteNome - NomeCliente

Enderecos
EnderecoID - Chave da tabela
EnderecoNome - Descrição do endereço
EnderecoTipo - Tipo do endereço, onde: 1=Residencial, 2=Comercial e 3=Correspondencia.

Alguem pod eme ajudar nessa consulta?
RCMRO 21/01/2010 13:16:36
#332492
Qual o Banco de dados?

SQL Server, MySQL, ACCESS, etc?
OSVALDO.ORODRIG 21/01/2010 15:34:25
#332515
Ola,

O banco de dados é sql server 2000.

Grato.
RCMRO 21/01/2010 16:32:29
#332527
Então, vamos nessa:

1. Em algum lugar vc tem que ter uma ligação entre os endereços e o Cliente. Assumi que na table Enderecos você tenha o campo ClienteId para poder ligar ambos.
2. O SELECT abaixo lista somente os clientes que tenham pelo menos 1 endereço cadastrado.

SELECT      cli.*, End3.*
FROM Clientes Cli (NOLOCK)
INNER JOIN (SELECT MIN(EnderecoTipo) EndTipo, ClienteId
FROM Enderecos End1 (NOLOCK)
GROUP BY ClienteId) End2
ON End2.ClienteId = Cli.ClienteId
INNER JOIN Enderecos End3 (NOLOCK)
ON End3.ClienteId = End3.ClienteId
AND End3.EnderecoTipo = End2.EndTipo
ORDER BY Cli.ClienteNome, Cli.ClienteId
OSVALDO.ORODRIG 21/01/2010 17:03:26
#332535
Precisaria que a consulta liste os registros que tenhas o endereço tipo 3, se o registro não tem o endereço tipo 3, então e xibe o tipo 2 e se não tem os tipos 3 ou 2, aí exibe o tipo1. Todos os clientes da base possuem ao menos um endereço que é do tipo 3, 2 ou 1. A consulta deve exibir registros exclusivos, não deve exibir registros com o mesmo ClienteID.
RCMRO 25/01/2010 09:44:31
#332772
Resposta escolhida
Pô, era só inverter o MIN para MAX... Tudo bem, ai vai

SELECT      cli.*, End3.*
FROM Clientes Cli (NOLOCK)
INNER JOIN (SELECT MAX(EnderecoTipo) EndTipo, ClienteId
FROM Enderecos End1 (NOLOCK)
GROUP BY ClienteId) End2
ON End2.ClienteId = Cli.ClienteId
INNER JOIN Enderecos End3 (NOLOCK)
ON End3.ClienteId = End3.ClienteId
AND End3.EnderecoTipo = End2.EndTipo
ORDER BY Cli.ClienteNome, Cli.ClienteId
RCMRO 28/01/2010 10:03:14
#333002
E ai, resolveu?
Se sim, fecha o tópico e pontua; Se não, manda a dúvida que a gente ajuda.
OSVALDO.ORODRIG 29/01/2010 13:47:06
#333172
Valeu,

Como adaptar o seu ótimo exemplo com os campos da minha tabela?

Clientes
ClienteID - Código do cliente
ClienteNome - NomeCliente

Enderecos
EnderecoID - Chave da tabela
EnderecoNome - Descrição do endereço
EnderecoTipo - Tipo do endereço, onde: 1=Residencial, 2=Comercial e 3=Correspondencia.



Valewu!!
RCMRO 29/01/2010 17:13:38
#333197
Não se trata de adaptar o meu código mas sim de saber COMO você sabe que o endereço pertence a um cliente. Vc não tem [Ô]ClienteID[Ô] na tabela [Ô]Enderecos[Ô] então, terá que ter uma terceira tabela em que relaciona o [Ô]Clientes->ClienteID[Ô] com [Ô]Enderecos->EnderecoID[Ô] senão, não dá para ligar as tabelas.

Como vc faz ??

O mais fácil seria mudar a tabela enderecos para:
Enderecos
EnderecoID - Chave da tabela
ClienteID - Chave do Cliente
EnderecoNome - Descrição do endereço
EnderecoTipo - Tipo do endereço, onde: 1=Residencial, 2=Comercial e 3=Correspondencia.


OSVALDO.ORODRIG 29/01/2010 17:59:04
#333202
Valeu de novo...
A tabela enderecos tem o campo clienteid. Vou postar as duvidas qto ao seu codigo:

- Duvida 1
SELECT cli.*, End3.*
FROM Clientes Cli (NOLOCK)...

O que é esse Cli em negrito?

- Duvida 2
...FROM Enderecos End1 (NOLOCK)

E esse End1?

valeu de novo pela ajuda cara


RCMRO 30/01/2010 21:55:31
#333258
Esses são ALIAS das tabelas... Só isso.
Declarando um ALIAS, toda a indicação à tabela (ou campo) passa a ser pelo ALIAS e não pelo NOME.

Ex.: Enderecos.EnderecoID passa a ser End1.EnderecoID.

Além do mais, como precisa referenciar os ENDERECOS por duas vezes, e mais uma vez como Sub-Querie, precisa de ALIAS senão como poderá individualizá-los? Assim, é mencionado por 3 vezes e eu resolvi chamar de END1, END2 e END3 mas poderia ser XPP, TFR e MIMI45 ou qquer outro que te der na telha....
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas