Somar Percentual Linha Anterior

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
jerry-sc
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Ter, 01 Nov 2011 1:24 pm

Bom dia,

Eu preciso fazer um SQL, que limite os registros em 80% do seu total.

Por exemplo, tenho o total de 1000 reais, entre N produtos. Preciso mostrar somente os registros que somarem 800 reais, os demais não quero mostrar.

Alguém tem noção de como fazer isso? Eu tenho pegar a primeira linha, somar com a segunda e assim por diante, até que chegue no valor de 800.

Obrigado!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pode usar funções analíticas pra isso. Veja esse exemplo:

Aqui está sua tabela:

Selecionar tudo

select deptno, sal from emp
order by 1;

DEPTNO       SAL
------ ---------
    10   2450.00
    10   1300.00
    10   5000.00
    20   3000.00
    20   3000.00
    20   2975.00
    20    800.00
    20   1100.00
    30   1250.00
    30   1250.00
    30   1500.00
    30    950.00
    30   1600.00
    30   2850.00

14 rows selected


SQL> 
Vamos ver quanto é a soma de cada grupo: (no caso, deptno).
Estamos considerando aqui que cada grupo pode ter a soma diferente.

Selecionar tudo

SELECT DEPTNO, SUM(SAL) 
fROM EMP
GROUP BY DEPTNO;

DEPTNO   SUM(SAL)
------ ----------
    30       9400
    20      10875
    10       8750

SQL> 
Agora, vamos colocar a Soma total (TOTAL_GRUPO) E a soma de cada linha (RUNNING)

Selecionar tudo

select deptno
, sal
, sum(sal) over (partition by deptno order by deptno, sal) running
, sum(sal) over (partition by deptno) total_grupo
from emp
order by 1,2;

DEPTNO       SAL    RUNNING TOTAL_GRUPO
------ --------- ---------- -----------
    10   1300.00       1300        8750
    10   2450.00       3750        8750
    10   5000.00       8750        8750
    20    800.00        800       10875
    20   1100.00       1900       10875
    20   2975.00       4875       10875
    20   3000.00      10875       10875
    20   3000.00      10875       10875
    30    950.00        950        9400
    30   1250.00       3450        9400
    30   1250.00       3450        9400
    30   1500.00       4950        9400
    30   1600.00       6550        9400
    30   2850.00       9400        9400

14 rows selected

SQL> 
Agora, eu mudei o ORDER BY pra deixar os valores maiores primeiro.
Também coloquei o percentual, baseado no RUNNING / TOTAL_GRUPO.

Selecionar tudo

select 
  deptno
, sal
, running / total_grupo * 100 perc
from 
  (
  select deptno
  , sal
  , sum(sal) over (partition by deptno order by deptno, sal desc) running
  , sum(sal) over (partition by deptno) total_grupo
  from emp
  order by 1,2 desc
  )
order by 1,2 desc

DEPTNO       SAL       PERC
------ --------- ----------
    10   5000.00 57.1428571
    10   2450.00 85.1428571
    10   1300.00        100
    20   3000.00 55.1724137
    20   3000.00 55.1724137
    20   2975.00 82.5287356
    20   1100.00 92.6436781
    20    800.00        100
    30   2850.00 30.3191489
    30   1600.00 47.3404255
    30   1500.00 63.2978723
    30   1250.00 89.8936170
    30   1250.00 89.8936170
    30    950.00        100

14 rows selected

SQL> 
Agora fica bem fácil você filtrar essa tabela, conforme o percentual que você precisa. 80%.
:-o
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá, Boa Tarde.

UTILIZE o

Selecionar tudo

HAVING running / total_grupo * 100 >= 80.
Sem mais,
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes