SQL Server (busca não trás os dados necessários)
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 ?
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
Curtidas 0
Melhor post
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:
Depois eu inserir seis notas fiscais, uma para cada mês:
Após isso eu inseri dois itens para cada nota, um de cada produto (Produto 1 e Produto 2):
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:
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:
Vê se te atende!
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
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
24/10/2016
Por nada João Victor! Se puder votar (curtir) minha resposta ficarei agradecido!
GOSTEI 2
João Victor
24/10/2016
Feito!
GOSTEI 0