Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

x_soldier

Query SQL - Repetição Clientes

Mensagens Recomendadas

x_soldier

Boas pessoal,

Estou com uma dificuldade na seguinte query:

SELECT DISTINCT {CUSTOMER}.[id], {CUSTOMER}.[Name], {CUSTOMER}.[Email], {CUSTOMER}.[FiscalNumber],
{CUSTOMER}.[PhoneNumber], {SIFOX_ACCOUNT}.[ExternalReference]
From {CUSTOMER}
INNER JOIN {CUSTOMER_TYPE} ON {CUSTOMER_TYPE}.[id] = {CUSTOMER}.[CustomerTypeId]
INNER JOIN {CUSTOMER_SIFOXCODE} ON {CUSTOMER_SIFOXCODE}.[CustomerId] = {CUSTOMER}.[OriginalCustomerId]
INNER JOIN {ACCOUNT_OWNERSHIP} ON {ACCOUNT_OWNERSHIP}.[sifoxCustomerId] = {CUSTOMER_SIFOXCODE}.[id]
INNER JOIN {SIFOX_ACCOUNT} ON {SIFOX_ACCOUNT}.[OriginalAccountId] = {ACCOUNT_OWNERSHIP}.[AccountId]
AND {CUSTOMER}.[isCurrent]= 1 AND {CUSTOMER}.[isEntity]= 0 AND {SIFOX_ACCOUNT}.[isCurrent] = 1

Ela deveria dar-me 4430 registos mas apresenta-me 5089, pois há clientes com mais de uma conta e ele vai busca-las todas á tabela CUSTOMER_SIFOXCODE.

Já tentei com LEFT JOINS também e já tentei com a query que apresento em baixo mas o resultado é sempre o mesmo.

Como é que poderia ultrapassar esta questão? Se é que é possivel claro...

SELECT CustomerOriginalCustomerId, CustomerName, CustomerEmail, CustomerFiscalNumber, CustomerPhoneNumber, CustomerExternalReference
FROM
(
SELECT DISTINCT {CUSTOMER}.[OriginalCustomerId] CustomerOriginalCustomerId, {CUSTOMER}.[Name] CustomerName, {CUSTOMER}.[Email] CustomerEmail, {CUSTOMER}.[FiscalNumber] CustomerFiscalNumber,
{CUSTOMER}.[PhoneNumber] CustomerPhoneNumber, {SIFOX_ACCOUNT}.[ExternalReference] CustomerExternalReference
From {CUSTOMER}
INNER JOIN {CUSTOMER_TYPE} ON {CUSTOMER_TYPE}.[id] = {CUSTOMER}.[CustomerTypeId]
INNER JOIN {CUSTOMER_SIFOXCODE} ON {CUSTOMER_SIFOXCODE}.[CustomerId] = {CUSTOMER}.[OriginalCustomerId]
INNER JOIN {ACCOUNT_OWNERSHIP} ON {ACCOUNT_OWNERSHIP}.[sifoxCustomerId] = {CUSTOMER_SIFOXCODE}.[id]
INNER JOIN {SIFOX_ACCOUNT} ON {SIFOX_ACCOUNT}.[OriginalAccountId] = {ACCOUNT_OWNERSHIP}.[AccountId]
AND {CUSTOMER}.[isCurrent]= 1 AND {CUSTOMER}.[isEntity]= 0 AND {SIFOX_ACCOUNT}.[isCurrent] = 1
GROUP BY {CUSTOMER}.[OriginalCustomerId], {CUSTOMER}.[Name], {CUSTOMER}.[Email], {CUSTOMER}.[FiscalNumber],
{CUSTOMER}.[PhoneNumber], {SIFOX_ACCOUNT}.[ExternalReference]
) T
GROUP BY CustomerOriginalCustomerId

Desde já Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
f-22

Boas,

Para a próxima vez que pedir ajuda tente explicar melhor a situação, as pessoas aqui do fórum podem ser excelentes profissionais, mas adivinhos creio que não. Ajudava saber como é que as tabelas estão "feitas" e se a partida o problema está no inner join com a tabela SIFOX_ACCOUNT, podia ter omitido o resto.

Bom mas vamos tentar...

Cada registo da tabela SIFOX_ACCOUNT tem na coluna ExternalReference dados diferentes para cada linha? mesmo que se refira ao mesmo cliente?

Se sim, é isso que está a fazer com que apareça os registos a mais que os pretendidos.

Sabe como funciona o distinct?

Por exemplo:

Id | Name | Email | FiscalNumber | PhoneNumber | ExternalReference

1 | XPTO | xpto@email.com | 123 | 961111111 | X

1 | XPTO | xpto@email.com | 123 | 961111111 | Y

1 | XPTO | xpto@email.com | 123 | 961111111 | X

Se tivermos os registos acima sem o distinct, ao aplicarmos o distinct, o SQL vai eliminar as linhas que sejam 100% iguais. Ora tendo em conta o exemplo acima a 1ª e 3ª "passa" a 1 linha só e a do meio é devolvida à mesma. O resultado da query com distinct seria:

Id | Name | Email | FiscalNumber | PhoneNumber | ExternalReference

1 | XPTO | xpto@email.com | 123 | 961111111 | X

1 | XPTO | xpto@email.com | 123 | 961111111 | Y

Caso queira mesmo devolver a coluna ExternalReference, diga-me qual o critério que quer usar para escolher entre essas 2 linhas? pode ser por exemplo, devolver a 1ª que aparecer, nesse caso a query seria:

SELECT * FROM 
(
SELECT DISTINCT {CUSTOMER}.[id], {CUSTOMER}.[Name], {CUSTOMER}.[Email], {CUSTOMER}.[FiscalNumber],
{CUSTOMER}.[PhoneNumber], {SIFOX_ACCOUNT}.[ExternalReference],
row_number() over (partition by {CUSTOMER}.[id] order by {SIFOX_ACCOUNT}.[ExternalReference]) as rn
FROM {CUSTOMER}
INNER JOIN {CUSTOMER_TYPE} ON {CUSTOMER_TYPE}.[id] = {CUSTOMER}.[CustomerTypeId]
INNER JOIN {CUSTOMER_SIFOXCODE} ON {CUSTOMER_SIFOXCODE}.[CustomerId] = {CUSTOMER}.[OriginalCustomerId]
INNER JOIN {ACCOUNT_OWNERSHIP} ON {ACCOUNT_OWNERSHIP}.[sifoxCustomerId] = {CUSTOMER_SIFOXCODE}.[id]
INNER JOIN {SIFOX_ACCOUNT} ON {SIFOX_ACCOUNT}.[OriginalAccountId] = {ACCOUNT_OWNERSHIP}.[AccountId]
AND {CUSTOMER}.[isCurrent]= 1 AND {CUSTOMER}.[isEntity]= 0 AND {SIFOX_ACCOUNT}.[isCurrent] = 1
) t
where t.rn = 1

NOTA: A query acima não foi testada, pode conter erros, mas fica a ideia

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
x_soldier

Boas,

Antes demais peço desculpa se não fui o mais esclarecedor possivel... E agradeço a sua paciente resposta!!

Respondendo ás suas questões:

A coluna ExternalReference da tabela SIFOX_ACCOUNT não tem resultados diferentes para o mesmo cliente, pois a ExternalReference está associada ao cliente.

Neste momento já tenho de forma temporária a apresentação da ExternalReference com uma função em que lhe passo o ID do cliente, mas no campo de pesquisa não consigo pesquisar pela ExternalReference, pois a mesma não está incluida na query.

Eu julgo que o problema está no Customer_Sifoxcode pois encontra lá mais que uma linha no caso do cliente ter mais que uma conta.

A sua query deve resolver-me o problema, vou fazer alguns testes e dar-lhe-ei o feedback.

Mais uma vez muito obrigado e um bom fds

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.