Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal tudo bem?
É o seguinte estou tentando fazer um script em SQL no Oracle que retorna o "código, nome, valor total vendido" do produto mais vendido em um determinado período.
Fiz o script, mas ele tá retornando como resultado todos os produtos vendido no período, e o que eu gostaria era que ele apenas me retorna o produto mais vendido. Eu coloquei a função agregada MAX(...), mas mesmo assim é retornado todos os produtos vendido no período, segue meu script.(OBS: ele tá funcionando, o problema é que não está retornando apenas o produto mais vendido, mas todos os produtos vendidos).
SELECT SUB.SUB_CODIGO, SUB.SUB_NOME, MAX(TESTE.TOTAL) FROM SUBSTANCIA SUB
INNER JOIN
(SELECT ITENS.SUB_CODIGO, SUM(ITENS.ITEM_NOT_SAI_QTDE * ITENS.ITEM_NOT_SAI_PRECO) AS TOTAL
FROM ITENS_NOTA_SAIDA ITENS INNER JOIN NOTA_SAIDA NOTA ON
NOTA.NOT_SAI_CODIGO = ITENS.NOT_SAI_CODIGO
WHERE NOT_SAI_DATA BETWEEN '17/03/2017' AND '17/03/2017'
GROUP BY ITENS.SUB_CODIGO
) TESTE
ON (SUB.SUB_CODIGO = TESTE.SUB_CODIGO)
GROUP BY SUB.SUB_CODIGO, SUB.SUB_NOME;
Em anexo tá o resultado que esta retornando pra vocês terem uma ideia do que eu to falando.
Se alguém poder me ajudar eu agradeço.
O que eu queria era apenas que retornasse o maior. Que nesse caso seria o produto mais vendido, ao inves de uma lista ordenada decrescente.
Limite para apenas um resultado. Depende da versão do oracle, pode-se usar ROWNUM ou ROWLIMIT (12c R1 - 12.1).
ROWNUM
SELECT * FROM
(/** sub-select **/)
WHERE ROWNUM = 1;
ROWLIMIT:
SELECT * FROM
(/** sub select **/)
FETCH FIRST ROW ONLY
http://stackoverflow.com/questions/42862903/transform-static-array-into-a-generated-by-foreach-loop
http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html
Deve ser isto
SELECT *
FROM
(
SELECT ITENS.SUB_CODIGO
RANK() OVER (PARTITION BY deptno ORDER BY TOTAL DESC) rank
FROM (SELECT ITENS.SUB_CODIGO,
SUM(ITENS.ITEM_NOT_SAI_QTDE * ITENS.ITEM_NOT_SAI_PRECO) AS TOTAL
FROM ITENS_NOTA_SAIDA ITENS INNER JOIN NOTA_SAIDA NOTA ON
NOTA.NOT_SAI_CODIGO = ITENS.NOT_SAI_CODIGO
WHERE NOT_SAI_DATA BETWEEN '17/03/2017' AND '17/03/2017')
) WHERE RANK = 1Boa tarde o que você necessita é utilizar o ROWNUM conforme mencionado pelo amigo Gabriel Heming, onde o comando ficaria desta forma:
SELECT SUB.SUB_CODIGO, SUB.SUB_NOME, MAX(TESTE.TOTAL) FROM SUBSTANCIA SUB
INNER JOIN
(SELECT ITENS.SUB_CODIGO, SUM(ITENS.ITEM_NOT_SAI_QTDE * ITENS.ITEM_NOT_SAI_PRECO) AS TOTAL
FROM ITENS_NOTA_SAIDA ITENS INNER JOIN NOTA_SAIDA NOTA ON
NOTA.NOT_SAI_CODIGO = ITENS.NOT_SAI_CODIGO
WHERE NOT_SAI_DATA BETWEEN '17/03/2017' AND '17/03/2017'
GROUP BY ITENS.SUB_CODIGO
) TESTE
ON (SUB.SUB_CODIGO = TESTE.SUB_CODIGO)
GROUP BY SUB.SUB_CODIGO, SUB.SUB_NOME
AND ROWNUM = 1;Obrigado pessoal deu certo, eu usei o ORDER BY no sql interno de depois usei o ROWNUM = 1, e retirei o MAX(...)
Utilize Analytic Functions
por exemplo RANK
RANK
The RANK analytic function assigns a sequential rank for each distinct value in the specified window.
---------- 10 10 9 9 8 8Fonte