Array
(
)

Select com dados duplicados

Marcelo
   - 20 jan 2016

Ola pessoal,
Estou com um select retornando dados duplicados e ainda não consegui uma solução:
SELECT ITENS.ite_ordem_compra, ITENS.ite_entrada, ITENS.ite_custo_atual, APAGAR.APA_DUPLICATA, APAGAR.apa_razao_social
FROM ITENS INNER JOIN APAGAR ON ITENS.ite_ordem_compra = APAGAR.APA_ORDEM_COMPRA
WHERE ITENS.ITE_CODIGO_MATERIAL = '113' ORDER BY ITENS.ITE_ORDEM_COMPRA
O Select funciona, mas vem dados duplicados do APAGAR quando as notas do Contas a Pagar tem vários registros com a mesma ordem de compra e
varias duplicatas
OC Entrada custo Duplicata Razao Social
=======================================
0000090 30 12.00 411315/1 Kalunga
0000092 40 13.80 028123/1 C&C
0000092 40 13.80 028123/2 C&C (Esse registro não era para sair, por ser mais de 1 duplicatas no Ctas a Pagar)
0000097 20 14.00 040765/1 Casa & Video
Alguém teria uma idéia de como retirar estes registros duplicados vindo do APAGAR ?
Grato pela atenção.

Huidemar Costa
|
MVP
Pontos: 200
    20 jan 2016

Eu usaria o DISTINCT
exemplo
Select DISTINCT
campo1,
campo2......

Marcelo
   - 20 jan 2016

Ola Huidemar,
Já tentei tanta coisa e não funcionou, teria como montar este select para saber como funciona
esta sintaxe?

Huidemar Costa
|
MVP
Pontos: 200
    20 jan 2016

Seria assim:
#Código

SELECT DISTINCT
ITENS.ite_ordem_compra, 
ITENS.ite_entrada, 
ITENS.ite_custo_atual, 
APAGAR.APA_DUPLICATA,
APAGAR.apa_razao_social
FROM ITENS INNER JOIN APAGAR ON (ITENS.ite_ordem_compra = APAGAR.APA_ORDEM_COMPRA)
WHERE ITENS.ITE_CODIGO_MATERIAL = '113' ORDER BY ITENS.ITE_ORDEM_COMPRA

Marcelo
   - 20 jan 2016

Não funcionou, saiu tudo duplicado como no exemplo que mandei.
:-(

Marcos P
   - 20 jan 2016

Marcelo,

O DISTINCT, obrigatoriamente, tem de resolver isso aí !

Senão resolveu é porque existem colunas que você está incluindo no SELECT que ainda estão gerando valores diferentes...

Faça um teste simples... usando a query do Huidemar deixe o DISTINCT e apenas a coluna ITENS.ite_ordem_compra.

Continuam aparecendo duplicações ?

Se sim, crie a estrutura de dados no SqlFiddle, crie a estrutura de dados, popule as tabelas e volte aqui... que tento lhe ajudar com o JOIN.

Se não, vá acrescentando as colunas na query uma-a-uma até achar aquela que está desempatando seu DISTINCT.

Ok ?!?

Huidemar Costa
|
MVP
Pontos: 200
    20 jan 2016

eu estava relendo seu post, agora eu acho que entendi o que vc está querendo, não que é os dados estão duplicados, é que quando tem mais de uma duplicata você quer que mostre apenas uma correto? no seu exemplo a duplicata 028123 está aparecendo 2x porque é parcela 1 e 2, entretanto você quer que mostre apenas a parcela 1, correto?

para isso você pode fazer mais ou menos assim:
#Código

SELECT DISTINCT
ITENS.ite_ordem_compra, 
ITENS.ite_entrada, 
ITENS.ite_custo_atual, 
(select first 1  APA_DUPLICATA from apagar where APA_ORDEM_COMPRA=ITENS.ite_ordem_compra order by apa_duplicata) apa_duplicata,
APAGAR.apa_razao_social
FROM ITENS INNER JOIN APAGAR ON (ITENS.ite_ordem_compra = APAGAR.APA_ORDEM_COMPRA)
WHERE ITENS.ITE_CODIGO_MATERIAL = '113' ORDER BY ITENS.ITE_ORDEM_COMPRA



Acredito que deve ser isto que você quer...
Deve existir outra maneira, no entanto, não consigo pensar em outra, mas, veja se é isso o que você precisa.

Marcelo
   - 21 jan 2016

Sim, as duplicatas são várias parcelas, mas só me interessa pegar os dados de 1 delas, onde tem o nome do fornecedor, data
da emissão, etc...

Mas seu exemplo não funcionou, deu erro neste FIRST 1. (Incorrect syntax near '1'.) Não funciona com TOP também.
Removendo este first 1, da outro erro:

Msg 1033, Level 15, State 1, Line 5
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

Também não consegui detectar o que estar "herrado"... :-(

Faabiianooc
   - 21 jan 2016

Tente isso.

#Código

SELECT 
ITENS.ite_ordem_compra, 
ITENS.ite_entrada, 
ITENS.ite_custo_atual, 
APAGAR.APA_DUPLICATA,
APAGAR.apa_razao_social
FROM ITENS INNER JOIN 
(SELECT ROW_NUMBER() OVER(PARTITION BY APA_ORDEM_COMPRA ORDER BY APA_ORDEM_COMPRA) D,* FROM
APAGAR) AS APAGAR
ON (ITENS.ite_ordem_compra = APAGAR.APA_ORDEM_COMPRA)
WHERE ITENS.ITE_CODIGO_MATERIAL = '113' 
AND APAGAR.D = 1
ORDER BY ITENS.ITE_ORDEM_COMPRA

Faabiianooc
   - 21 jan 2016

Veja que criei uma query dentro dos parenteses para saber se possui registros duplicados ou não.

Veja mais sobre Funcoes de Classificacao

Marcelo
   - 21 jan 2016

Ola Marcos P,
Como disse na mensagem anterior, não funcionou...
Após alguns testes neste tal de Sqlfidle, consegui fazer a estrutura e os dados nos 2 arquivos, e rodei um
select simples neles e apresentou os dados.
E agora? O que fazer para você ter acesso a essa tela? Passar o link?
http://sqlfiddle.com/#!3/1646a/3
Abraços.

Huidemar Costa
|
MVP
Pontos: 200
    21 jan 2016

É que o first funciona no FireBird, para o seu banco de dados, eu não conheço o comando para selecionar apenas 1 registro.

Você precisa do número da Duplicata?

Se não for precisar tire e o sql dverá ficar assim ->

#Código

SELECT DISTINCT
ITENS.ite_ordem_compra,
ITENS.ite_entrada,
ITENS.ite_custo_atual,
APAGAR.apa_razao_social
FROM ITENS INNER JOIN APAGAR ON (ITENS.ite_ordem_compra = APAGAR.APA_ORDEM_COMPRA)
WHERE ITENS.ITE_CODIGO_MATERIAL = '113' ORDER BY ITENS.ITE_ORDEM_COMPRA


O problema está na coluna duplicata, veja nesse último SQL eu tirei a coluna duplicata, MAS mantive o DISTINCT.

Marcos P
   - 21 jan 2016

Muita gente ( boa ) passou por aqui para ajudar !

Tente as dicas postadas e informe... quem sabe a solução já está no próprio post !

Senão funcionar, partimos para o SqlFiddle.

Marcos P
   - 22 jan 2016

E aí ?

Helder
   - 19 fev 2016

Olá pessoal, tudo bem?
Não sei se já conhecem, mas existe uma plataforma para criação de webservices muito eficiente, basta apenas liberar acesso para o banco de dados, e você pode criar uma nova tabela, um novo campo com apenas um clique, talvez ajude muito vocês.
Fica a indicação do Datasocket.
datasocket.co/free