рассчитать разницу между столбцом таблицы за два дня - PullRequest
0 голосов
/ 07 октября 2018

У меня есть таблица, как показано ниже в базе данных Oracle:

s_num     eff_date     amount
1         07-OCT-18      110
1         06-OCT-18      50
2         07-OCT-18      200
2         06-OCT-18      150

Я хочу найти разницу между столбцом «сумма» на сегодня и вчера.и результат должен быть, как показано ниже

s_num    diff
1         60
2         50

Я хочу сделать это без объединения таблицы с самим собой.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018
sql>set serveroutput on;
sql>create or replace function difference(n in number) return number as di 
    number(5);
 2  begin
 3  select ((select amount from oc where dob=trunc(sysdate) and snum=n)- 
    (select 
    amount from oc where dob=trunc(sysdate-1) and snum=n)) into di from dual;
 4  return di;
 5  end;
 6  /
 sql>select distinct snum,difference(snum) as diff from oc;

выход:

                   SNUM       DIFF
            ---------- ----------
                    2         50
                    1         60
0 голосов
/ 07 октября 2018

Вы можете использовать условное агрегирование

SELECT s_num,SUM (CASE 
                    WHEN eff_date >= TRUNC(sysdate) 
                       AND eff_date < TRUNC(sysdate) + 1 THEN amount --today
                    WHEN eff_date >= TRUNC(sysdate) - 1 
                       AND eff_date < TRUNC(sysdate) THEN - amount --yesterday
                END) 
    FROM   t 
    GROUP  BY s_num; 

Или LAG функция

SELECT s_num, 
       diff 
FROM   (SELECT s_num, 
               eff_date,
               amount - LAG(amount, 1, 0) 
                          OVER ( 
                            partition BY s_num 
                            ORDER BY eff_date ) AS diff 
        FROM   t) 
WHERE  eff_date >= trunc(sysdate) 
       AND eff_date < trunc(sysdate) + 1 ;

Демо

Первый выводит разницу NULL для дней, отличных от сегодняшнего дня, второй не возвращает строк для других дат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...