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

[Projeto] Meu código.

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];
1 resposta
solução!

Olá, Akhenaton, tudo bem?

Primeiramente, parabéns por seu esforço em elaborar essa Stored Procedure. É um trabalho complexo e você demonstrou um bom entendimento do T-SQL. Analisando o seu código, não identifiquei nenhum erro em relação às boas práticas do T-SQL.

Achei interessante o uso de tabela temporária, ela é bem útil quando estamos armazenando os valores de uma tabela para utilizá-los posteriormente no procedimento.

Akhenaton, continue com essa dedicação que você vai longe!

Caso surja alguma dúvida, é só compartilhar no fórum.

Abraços e bons estudos!