1
resposta

Divergência na quantidade de NFs

Boa tarde!

Eu criei essa procedure para calcular o número de notas e o faturamento em um determinado ano para um CPF, mas os valores das quantidades de notas estão divergentes, alguém sabe onde estou errando? -- Query criada

CREATE PROCEDURE Faturamento_por_cliente (@CPF VARCHAR(12), @ANO INT)

AS

BEGIN

SELECT TC.CPF, COUNT(NF.NUMERO) AS QDE_NOTAS, YEAR(NF.DATA) ANO, SUM(INF.QUANTIDADE*INF.PREÇO) AS FATURAMENTO

FROM [TABELA DE CLIENTES]TC INNER JOIN [NOTAS FISCAIS]NF ON TC.CPF = NF.CPF

INNER JOIN [ITENS NOTAS FISCAIS]INF ON INF.NUMERO = NF.NUMERO

WHERE YEAR(NF.DATA) = @ANO AND TC.CPF = @CPF 
GROUP BY TC.CPF, YEAR(NF.DATA)

END

EXEC Faturamento_por_cliente @CPF = '19290992743', @ANO = 2017

Output: CPF, QDE_NOTAS, ANO, FATURAMENTO

19290992743, 4653, 2017, 3222999,90375999

-- Query de comparação:

SELECT COUNT(*) FROM [NOTAS FISCAIS] WHERE CPF = '19290992743' AND YEAR([DATA]) = 2017

SELECT SUM(QUANTIDADE * [PREÇO]) FROM [ITENS NOTAS FISCAIS] B INNER JOIN [NOTAS FISCAIS] A ON A.NUMERO = B.NUMERO WHERE CPF = '19290992743' AND YEAR([DATA]) = 2017

Output:

1992 (Quantidade de Notas - Esse é o valor divergente)

3222999,90375999 (Faturamento - Valor ok)

1 resposta

Opa Felipe, tudo bom?

Então cara, eu analise a sua procedure e localizei o erro.

Esse join aqui,

INNER JOIN [ITENS NOTAS FISCAIS]INF ON INF.NUMERO = NF.NUMERO

Está influenciando no count e trazendo um valor diferente. Eu tentei fazer tudo no mesmo select, mas não deu certo. Infelizmente terá que fazer os selects separados. Algo parecido nesse estilo aqui:

CREATE PROCEDURE RetornaValores
@CPF AS VARCHAR(12),
@ANO AS INT,
@NUM_NOTAS AS INT OUTPUT,
@FATURAMENTO AS FLOAT OUTPUT
AS
BEGIN
    SELECT @NUM_NOTAS = COUNT(*) 
    FROM [NOTAS FISCAIS] WHERE CPF = @CPF
    AND YEAR([DATA]) = @ANO

    SELECT @FATURAMENTO = SUM(QUANTIDADE * [PREÇO]) 
    FROM [ITENS NOTAS FISCAIS] B
    INNER JOIN [NOTAS FISCAIS] A ON A.NUMERO = B.NUMERO
    WHERE CPF = @CPF
    AND YEAR([DATA]) = @ANO
END

Espero que tenha te ajudado. Qualquer coisa é só falar, tá bom? :)