Errei em alguma boa prática do T-SQL? Acham que poderia melhorar em algum detalhe? A tablea temporária # ficou desnecessária ou utilizei de uma boa maneira?
--Usando Storage Procedure
CREATE TABLE #FRUTASCITRICAS (NUMERO INT, SABOR VARCHAR(20));
INSERT INTO #FRUTASCITRICAS VALUES (1, 'Laranja');
INSERT INTO #FRUTASCITRICAS VALUES (2, 'Lima/Limão');
INSERT INTO #FRUTASCITRICAS VALUES (3, 'Morango');
INSERT INTO #FRUTASCITRICAS VALUES (4, 'Morango/Limão');
INSERT INTO #FRUTASCITRICAS VALUES (5, 'Uva');
SELECT * FROM #FRUTASCITRICAS;
CREATE PROCEDURE vendaTotalPorDepartamento
@CITRICAS AS FLOAT OUTPUT,
@NAO_CITRICAS AS FLOAT OUTPUT,
@DATA_INICIAL AS DATE = '2015-01-01',
@DATA_FINAL AS DATE = '2018-03-28'
AS
BEGIN
DECLARE @DATA_ANALISADA DATE, @NUMERO_NO_PERIODO INT;
DECLARE @NF_SELECIONADA TABLE ([DATA] DATE, NUMERO INT);
DECLARE @LIMITE_MINIMO INT, @LIMITE_MAXIMO INT;
SELECT @LIMITE_MINIMO = MIN(NUMERO) FROM [NOTAS FISCAIS];
SELECT @LIMITE_MAXIMO = MAX(NUMERO) FROM [NOTAS FISCAIS];
SELECT @DATA_INICIAL = '2015-01-01';
SELECT @DATA_FINAL = '2018-03-28';
WHILE @LIMITE_MINIMO <= @LIMITE_MAXIMO
BEGIN
SELECT @DATA_ANALISADA = [DATA], @NUMERO_NO_PERIODO = NUMERO FROM [NOTAS FISCAIS] WHERE NUMERO = @LIMITE_MINIMO;
IF (@DATA_INICIAL <= @DATA_ANALISADA AND @DATA_FINAL >= @DATA_ANALISADA)
INSERT INTO @NF_SELECIONADA VALUES (@DATA_ANALISADA, @NUMERO_NO_PERIODO)
--PRINT @LIMITE_MINIMO;
SET @LIMITE_MINIMO = @LIMITE_MINIMO + 1;
END;
DECLARE @TESTE_SABOR INT;
DECLARE @VERIFICA_SABOR VARCHAR(20), @VERIFICA_PRODUTO VARCHAR(10);
DECLARE @SABOR_DEPARTAMENTO TABLE (SABOR VARCHAR(20), [CODIGO DO PRODUTO] VARCHAR(10), DEPARTAMENTO VARCHAR(20));
SET @LIMITE_MINIMO = 1;
SELECT @LIMITE_MAXIMO = COUNT(*) FROM [TABELA DE PRODUTOS];
WHILE @LIMITE_MINIMO <= @LIMITE_MAXIMO
BEGIN
SELECT @VERIFICA_SABOR = TP.SABOR, @VERIFICA_PRODUTO = TP.[CODIGO DO PRODUTO] FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [CODIGO DO PRODUTO]) AS RowNum, SABOR, [CODIGO DO PRODUTO] FROM [TABELA DE PRODUTOS]
) TP WHERE TP.RowNum = @LIMITE_MINIMO;
SELECT @TESTE_SABOR = COUNT (*) FROM #FRUTASCITRICAS WHERE SABOR = @VERIFICA_SABOR;
IF @TESTE_SABOR <> 0
INSERT INTO @SABOR_DEPARTAMENTO (SABOR, [CODIGO DO PRODUTO], DEPARTAMENTO) VALUES (@VERIFICA_SABOR, @VERIFICA_PRODUTO, 'FRUTAS CÍTRICAS');
ELSE
INSERT INTO @SABOR_DEPARTAMENTO (SABOR, [CODIGO DO PRODUTO], DEPARTAMENTO) VALUES (@VERIFICA_SABOR, @VERIFICA_PRODUTO, 'FRUTAS NÃO CÍTRICAS');
SET @LIMITE_MINIMO = @LIMITE_MINIMO + 1;
END;
SELECT @CITRICAS =SUM(X.QUANTIDADE * X.PREÇO) FROM @SABOR_DEPARTAMENTO SD INNER JOIN (
SELECT INF.NUMERO, INF.[CODIGO DO PRODUTO], INF.QUANTIDADE, INF.PREÇO FROM @NF_SELECIONADA NFS INNER JOIN [ITENS NOTAS FISCAIS] INF ON INF.NUMERO = NFS.NUMERO
) X ON X.[CODIGO DO PRODUTO] = SD.[CODIGO DO PRODUTO] WHERE DEPARTAMENTO = 'FRUTAS CÍTRICAS' GROUP BY SD.DEPARTAMENTO
PRINT @CITRICAS;
SELECT @NAO_CITRICAS =SUM(X.QUANTIDADE * X.PREÇO) FROM @SABOR_DEPARTAMENTO SD INNER JOIN (
SELECT INF.NUMERO, INF.[CODIGO DO PRODUTO], INF.QUANTIDADE, INF.PREÇO FROM @NF_SELECIONADA NFS INNER JOIN [ITENS NOTAS FISCAIS] INF ON INF.NUMERO = NFS.NUMERO
) X ON X.[CODIGO DO PRODUTO] = SD.[CODIGO DO PRODUTO] WHERE DEPARTAMENTO = 'FRUTAS NÃO CÍTRICAS' GROUP BY SD.DEPARTAMENTO
PRINT @NAO_CITRICAS;
END;
DECLARE @CITRICAS AS FLOAT;
DECLARE @NAO_CITRICAS AS FLOAT;
SET @CITRICAS = 0;
SET @NAO_CITRICAS = 0;
SELECT @CITRICAS, @NAO_CITRICAS;
EXEC vendaTotalPorDepartamento @CITRICAS OUTPUT, @NAO_CITRICAS OUTPUT;
SELECT @CITRICAS AS [VENDAS TOTAIS DE SABORES CÍTRICOS], @NAO_CITRICAS AS [VENDAS TOTAIS DE SABORES NÃO CÍTRICOS];