Bom dia galera.

Fiz uma query que retorna vários clientes de uma determinada tabela numa situação especifica, se o cliente tem mais de uma compra, ele vem na quantidade de compras que fez, só que eu precisava apenas da ultima compra de cada cliente, o order by desc com fetch first 1 rows n vai rolar porque senão ele vai trazer apenas o ultimo registro da tabela, e eu preciso do ultimo de cada cliente. Alguém tem uma solução? imagino que precisa fazer uma select auxiliar (select dentro da select), mas sinceramente não manjo dessa parte. 

Exibições: 370

Respostas a este tópico

Se postar a SQL ficará mais fácil te ajudar.

Use o ROW_NUMBER() OVER PARTITION

Olha esse caso, você tem uma tabela com DOCUMENTID e você quer pegar o último resultado de cada DOCUMENTID

CREATE TABLE TESTEDOC
(
ID INT IDENTITY(1,1),
DOCUMENTID INT,
STATUS BIT,
DATECREATED DATETIME
)

insert into TESTEDOC values (1 , 1 , '7/29/2011')
insert into TESTEDOC values (1 , 1 , '7/30/2011')
insert into TESTEDOC values (1 , 1 , '8/02/2011')
insert into TESTEDOC values (2 , 1 , '7/28/2011')
insert into TESTEDOC values (2 , 1 , '7/30/2011')
insert into TESTEDOC values (2 , 1 , '8/01/2011')
insert into TESTEDOC values (3 , 1 , '8/02/2011')

WITH cte AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
FROM testedoc
)

SELECT *
FROM cte
WHERE rn = 1

Rode esse script e veja se é o que acontece, se for o que você precisa, aplique ao seu caso. 

Segue abaixo Clayton

SELECT A1_MSFIL AS FILIAL,
A1_COD AS CODIGO,
A1_NOME AS NOME,
L1_EMISNF,
A1_CGC AS CPF,
A1_TPCLIEN AS TP_CLI,
A1_DDD AS DDD,
A1_TEL AS TELEFONE,
A1_CELULAR AS CELULAR,
A1_END AS RUA,
A1_NUM AS NUMERO,
A1_BAIRRO AS BAIRRO,
A1_MUN AS CIDADE,
A1_EST AS UF,
A1_CEP AS CEP,
A1_EMAIL AS EMAIL,
L1_FORMPG AS MOEDA
FROM (SELECT A1.* FROM SA1010 A1
WHERE A1_FILIAL = ''
AND A1_LOJA = '01'
AND A1_PESSOA = 'F'
AND A1_ULTCOM >= '20140810'
AND A1_ULTCOM <> ''
AND A1_MSFIL IN (SELECT PAS_LOJA FROM PAS010 PAS WHERE PAS_FILIAL = '' AND PAS_REGIAO <> '99' AND PAS_DESPRA LIKE ('%BH%') AND PAS.D_E_L_E_T_ = '')
AND A1.D_E_L_E_T_ = '') A, SL1010 L1
WHERE L1_FILIAL BETWEEN '01' AND 'J0'
AND L1_CLIENTE = A.A1_COD
AND L1_DOC <> ''
AND L1_FORMPG <> ''
AND L1_EMISNF >= '20140810'
AND L1.D_E_L_E_T_ = ''
GROUP BY A1_MSFIL, A1_COD, A1_NOME, A1_CGC, A1_TPCLIEN, A1_DDD, A1_TEL, A1_CELULAR, A1_END, A1_NUM, A1_BAIRRO, A1_MUN, A1_EST, A1_CEP, A1_EMAIL, L1_FORMPG, L1_EMISNF

ai como vc parte do resultado, volta com dados repetidos.

47 881700 MARCIA***20140816
47 881700 MARCIA*** 20140818
47 882305 WANIA*** 20140816
47 885150 JANAINE*** 20140818

RSS

© 2017   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço