Jump to content

Query SQL - Repetição Clientes


x_soldier
 Share

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.