x_soldier Posted February 23, 2012 Report Share Posted February 23, 2012 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 More sharing options...
f-22 Posted February 23, 2012 Report Share Posted February 23, 2012 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 More sharing options...
x_soldier Posted February 24, 2012 Author Report Share Posted February 24, 2012 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now