Primeiro criei duas funções, uma para categorizar os departamentos e outra para calcular o faturamento por sabor em um intervalo de data
CREATE FUNCTION CATEGORIA (@SABOR VARCHAR(20))
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @MENSAGEM VARCHAR(100)
IF @SABOR = 'Laranja' OR @SABOR = 'Lima/Limão' OR @SABOR = 'Maracujá' OR @SABOR = 'Morango/Limão'
SET @MENSAGEM = 'FRUTAS CÍTRICAS'
ELSE
SET @MENSAGEM = 'FRUTAS NÃO CÍTRICAS'
RETURN @MENSAGEM
END;
CREATE FUNCTION FaturamentoPorSaborIntervalo
(@SABOR VARCHAR(20), @DATA_INIC DATETIME, @DATA_FIN DATETIME)
RETURNS FLOAT
AS
BEGIN
DECLARE @FATURAMENTO FLOAT
SELECT @FATURAMENTO = SUM(A.QUANTIDADE * A.PREÇO)
FROM [NOTAS FISCAIS] NF
INNER JOIN (SELECT TP.SABOR,INF.NUMERO, INF.QUANTIDADE, INF.PREÇO
FROM [TABELA DE PRODUTOS] TP
INNER JOIN [ITENS NOTAS FISCAIS] INF
ON TP.[CODIGO DO PRODUTO] = INF.[CODIGO DO PRODUTO]) A
ON NF.NUMERO = A.NUMERO
WHERE NF.[DATA] >= @DATA_INIC AND NF.[DATA] <= @DATA_FIN AND A.SABOR = @SABOR
RETURN @FATURAMENTO
END;
Feito isso criei uma Procedure que pede de input uma data inicial e uma data final:
CREATE PROCEDURE RELATORIO
(
@DATA_INIC DATETIME,
@DATA_FIN DATETIME
)
AS
BEGIN
SELECT DISTINCT SABOR, dbo.CATEGORIA(SABOR) AS DEPARTAMENTO, dbo.FaturamentoPorSaborIntervalo(SABOR,@DATA_INIC,@DATA_FIN) AS FATURAMENTO FROM [TABELA DE PRODUTOS];
END
Depois testei a Procedure com um intervalo:
EXEC dbo.RELATORIO '20170101','20171231';
e esse foi o resultado (Acredito que quanto mais simples melhor):