SQL Server (busca não trás os dados necessários)

SQL Server

24/10/2016

Boa tarde galera!

Estou com um problema para atender uma necessidade de uma empresa, seguinte:

- Preciso de um relatório que me mostre um histórico do valor de cada produto em um período de 6 meses. Exemplo:

Produto / 09/2016 / 10/2016 / 11/2016 / 12/2016/
a 2,13 2,25 2,35 2,40
b 5,60 6,10 6,13 6,43

Acima esta um exemplo básico da minha necessidade, porém, enfrento um problema, em alguns determinados meses é feito a compra de um produto x mais de 1 vez, com dois valores diferentes e neste relatório eu preciso mostrar o menor valor em que o produto foi adquirido neste mesmo mês. O SQL Que estou utilizando segue abaixo, porém ele só me retorna o menor valor de um produto e de apenas um mês, eu preciso de trazer o valor dos 6 últimos meses e todos os produtos.

ALGUÉM PODE ME AJUDAR POR GENTILEZA ?

SELECT DISTINCT
  CAST(DATEPART(MONTH, A.DATEMINF) AS VARCHAR(2)) + '/' +
  CAST(DATEPART(YEAR , A.DATEMINF) AS VARCHAR(4)),
  B.CODPRO,
  B.VALUNI 
FROM 
  NOTA_FISCAL_ENTRADA A,
  ITEM_NOTA_FISCAL_ENTRADA B
WHERE
  A.NUMCTL = B.NUMCTL AND
  B.VALUNI = (SELECT MIN(B.VALUNI) FROM ITEM_NOTA_FISCAL_ENTRADA B)
João Victor

João Victor

Curtidas 0

Melhor post

Npi Tecnologia

Npi Tecnologia

24/10/2016

Boa tarde João Victor!

Bem, como eu não tenho o banco de dados, primeiro eu criei essas tabelas com base no select que você postou:
CREATE TABLE NOTA_FISCAL_ENTRADA(
  NUMCTL INT NOT NULL,
  DATEMINF DATETIME NOT NULL,
);
GO

CREATE TABLE ITEM_NOTA_FISCAL_ENTRADA(
  NUMCTL INT NOT NULL,
  VALUNI DECIMAL(10, 2) NOT NULL,
  CODPRO INT NOT NULL
);
GO


Depois eu inserir seis notas fiscais, uma para cada mês:
INSERT INTO NOTA_FISCAL_ENTRADA VALUES (1, '2016-01-01');
INSERT INTO NOTA_FISCAL_ENTRADA VALUES (2, '2016-02-01');
INSERT INTO NOTA_FISCAL_ENTRADA VALUES (3, '2016-03-01');
INSERT INTO NOTA_FISCAL_ENTRADA VALUES (4, '2016-04-01');
INSERT INTO NOTA_FISCAL_ENTRADA VALUES (5, '2016-05-01');
INSERT INTO NOTA_FISCAL_ENTRADA VALUES (6, '2016-06-01');
GO


Após isso eu inseri dois itens para cada nota, um de cada produto (Produto 1 e Produto 2):
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (1, 1.9, 1);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (2, 2.9, 1);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (3, 3.9, 1);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (4, 4.9, 1);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (5, 5.9, 1);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (6, 6.9, 1);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (1, 11.9, 2);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (2, 12.9, 2);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (3, 13.9, 2);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (4, 14.9, 2);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (5, 15.9, 2);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (6, 16.9, 2);
GO


Por último eu criei dois itens de produtos repetidos com valores maiores do que os primeiros inseridos, logo esses dois não deverão sair no resultado:
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (1, 2.9, 1);
INSERT INTO ITEM_NOTA_FISCAL_ENTRADA VALUES (6, 17.9, 2);
GO


Pronto, agora dá para eu testar o select. Eu fiz o select trazendo o menor valor do produto para aquele mês, para isso eu utilizei a função MIN em conjunto com a clausula GROUP BY:
SELECT CODPRO AS PRODUTO,
       SUBSTRING(CONVERT(VARCHAR(10), DATEMINF, 103), 4, 7) AS 'MÊS',
       MIN(VALUNI) AS 'VALOR'
  FROM NOTA_FISCAL_ENTRADA A,
       ITEM_NOTA_FISCAL_ENTRADA B
 WHERE A.NUMCTL = B.NUMCTL
 GROUP BY SUBSTRING(CONVERT(VARCHAR(10), DATEMINF, 103), 4, 7),
          CODPRO;


Vê se te atende!
GOSTEI 3

Mais Respostas

João Victor

João Victor

24/10/2016

Meu amigo, primeiramente obrigado pela atenção e disponibilidade em me auxiliar de uma forma tão dedicada quanto a vista acima. Em segundo lugar seu SQL foi perfeito em resolver meu problema, muito obrigado! Fiquei imensamente surpreendido com a dedicação em ajudar, principalmente por ter criado minhas tabelas, e as populado, para resolver o problema da melhor maneira. Thanks!
GOSTEI 1
Npi Tecnologia

Npi Tecnologia

24/10/2016

Por nada João Victor! Se puder votar (curtir) minha resposta ficarei agradecido!
GOSTEI 2
João Victor

João Victor

24/10/2016

Feito!
GOSTEI 0
POSTAR