Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Filtrar primeira nota fiscal de cada cliente.

fiz a seguinte consulta:

SELECT TC.[NOME], NF.[CPF], INF.[NUMERO], SUM(INF.[QUANTIDADE * INF.PREÇO]) AS VALOR_DA_NOTA FROM [NOTAS FISCAIS] NF
INNER JOIN [ITENS NOTAS FISCAIS] INF ON NF.[NUMERO] = INF.[NUMERO]
INNER JOIN [TABELA DE CLIENTES] TC ON NF.[CPF] = TC.[CPF]
GROUP BY TC.[NOME], NF.[CPF], INF.[NUMERO]
ORDER BY TC.[NOME], INF.[NUMERO]

A qual me retornou o nome,cpf do cliente, todas as notas fiscais (NUMERO) e o valor de cada nota fiscal. Agora gostaria de visualizar apenas a primeira nota de cada cliente, como fazer?

1 resposta
solução!

Oii Júlio, como você está?

Sinto muito pela demora em obter um retorno.

Muito interessante seu questionamento. Uma das formas de obter este resultado é utilizando as cláusulas TOP WITH TIES e ROW_NUMBER(), como mostro abaixo:

SELECT TOP 1 WITH TIES TC.[NOME], NF.[CPF], INF.[NUMERO], SUM(INF.[QUANTIDADE] * INF.[PREÇO]) AS VALOR_DA_NOTA FROM [NOTAS FISCAIS] NF
INNER JOIN [ITENS NOTAS FISCAIS] INF ON NF.[NUMERO] = INF.[NUMERO]
INNER JOIN [TABELA DE CLIENTES] TC ON NF.[CPF] = TC.[CPF]
GROUP BY TC.[NOME], NF.[CPF], INF.[NUMERO]
ORDER BY ROW_NUMBER() OVER(PARTITION BY TC.[NOME] ORDER BY INF.[NUMERO] ASC) 

A cláusula TOP juntamente com a WITH TIES fará com que seja retornado a primeira ocorrência de cada agrupamento e no agrupamento, estamos agrupando por linhas, fazendo com que sejam únicas através do código ROW_NUMBER() OVER(PARTITION BY TC.[NOME] ORDER BY INF.[NUMERO] ASC). A coluna que colocamos após o código partition by irá definir como o SQL agrupa os dados, ou seja, por nome, sendo que dentro de cada grupo as linhas serão classificadas em ordem crescente, por isso do ASC. Vale ressaltar que se não utilizarmos a cláusula WITH TIES, apenas a quantidade de registros que colocarmos em TOP será retornada. Então se fosse apenas SELECT TOP 3, apenas os 3 primeiros registros apareceriam. Tudo bem?!

Agora, se executar o código, veja que será retornado apenas a primeira ocorrência do agrupamento, como mostro abaixo:

Print da tela do SSMS, onde o comando: 'SELECT TOP 1 WITH TIES TC.[NOME], NF.[CPF], INF.[NUMERO], SUM(INF.[QUANTIDADE] * INF.[PREÇO]) AS VALOR_DA_NOTA FROM [NOTAS FISCAIS] NF
INNER JOIN [ITENS NOTAS FISCAIS] INF ON NF.[NUMERO] = INF.[NUMERO]
INNER JOIN [TABELA DE CLIENTES] TC ON NF.[CPF] = TC.[CPF]
GROUP BY TC.[NOME], NF.[CPF], INF.[NUMERO]
ORDER BY ROW_NUMBER() OVER(PARTITION BY TC.[NOME] ORDER BY INF.[NUMERO] ASC)' foi executado e o resultado retornado foi o nome, CPF, numero da nota e valor da nota, da primeira nota inserida no banco de dados de cada cliente

A título de curiosidade, caso queira entender mais sobre as cláusulas TOP e ROW_NUMBER, deixo abaixo o link da documentação:

Qualquer dúvida fico à disposição.

Abraços e bons estudos!