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
  

Mensagemem Dom, 03 Mar 2019 9:07 am

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!
jerry-sc

Mensagemem Seg, 04 Mar 2019 3:24 pm

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

Aqui está sua tabela:
Código: Selecionar todos
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.
Código: Selecionar todos
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)
Código: Selecionar todos
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.
Código: Selecionar todos
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
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qui, 14 Mar 2019 1:37 pm

Olá, Boa Tarde.

UTILIZE o
Código: Selecionar todos
HAVING running / total_grupo * 100 >= 80.


Sem mais,
vitellozzi
Localização: Itatiba



Voltar para PL/SQL

Quem está online

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