powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сложность с решением задач
5 сообщений из 5, страница 1 из 1
Сложность с решением задач
    #40052848
robot_sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть базовое описание таблицы.

Имеется таблица проводок по счетам, отражающая факты начисления или списания денежных средств по счетам клиента. Состоит из столбцов:
• BUSINESS_DT - дата проводки
• ACCOUNT_DEBIT_ID - идентификатор счета дебита, с которого списываются средства
• ACCOUNT_CREDIT_ID - идентификатор счета кредита, на который начисляются средства
• POSTING_AMT - сумма проводки в рублях. Т.е. сумма средств, которая списывается со счета дебита и зачисляется на счет кредита. Значение всегда положительное.

Нужно написать SQL-запрос , который выводит таблицу остатков за весь период, за который нам известны проводки (например, с января по март). Начальные остатки по всем счетам полагаем равными нулю. Таблица должна состоять из следующих столбцов:
• Account_ID – идентификатор счета
• Business_From_DT – дата, начиная с которой (включительно) сформировался указанный остаток на счете.
• Business_To_DT – дата, по которую (включительно) на счете находится указанный остаток. Если остаток действует по текущий момент (дата следующего изменения остатка не известна), то поле следует заполнить датой 9999-12-31.
• Account_Balance – остаток на счете Account_ID в период с Business_From_DT по Business_To_DT включительно.

И еще написать SQL запрос, который выведет остатки на каждый день за период с января по март. Т.е. по каждому счету таблица должна содержать около 90 записей. Начальные остатки по всем счетам полагаем равными нулю. Столбцы таблицы:
• Account_ID – идентификатор счета
• Business_Date – дата, на которую посчитан остаток
• Account_Balance – остаток на счете, может быть отрицательным.

Уже выполнил самостоятельно ряд других заданий, приведу пример одного из них. Написать SQL-запрос, который на основании таблицы проводок рассчитает остатки по счетам на текущую дату. Начальные остатки по всем счетам полагаем равными нулю. Таблица должна состоять из следующих столбцов:
• Account_ID – идентификатор счета
• Current_Date – дата, на которую посчитан остаток
• Account_Balance – остаток на счете, может быть отрицательным.

Вот код, который работает и выполняет поставленную задачу.
WITH test AS (SELECT ACCOUNT_DEBIT_ID as a, -POSTING_AMT as m FROM t WHERE BUSINESS_DT <= sysdate
UNION ALL
SELECT ACCOUNT_CREDIT_ID as a, POSTING_AMT as m FROM t WHERE BUSINESS_DT <= sysdate)
SELECT a, sysdate, sum(m)
FROM test
GROUP BY 1
ORDER BY 1

Заранее подготовил тестовые данный для выполнения запроса
with t (BUSINESS_DT,ACCOUNT_DEBIT_ID,ACCOUNT_CREDIT_ID,POSTING_AMT) as(
select 2020-03-10, 1, 2, 1000 from dual union all
select 2020-03-10, 2, 1, 100 from dual union all
select 2020-03-10, 3, 1, 200 from dual union all
select 2020-03-15, 2, 1, 150 from dual union all
select 2020-03-19, 2, 3, 100 from dual union all
select 2020-03-200, 3, 2, 50 from dual)

Что касается моих сложностей не до конца понимаю, как решить те задачи, буду рада любой помощи заранее спасибо!
...
Рейтинг: 0 / 0
Сложность с решением задач
    #40052853
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
robot_samНужно написать SQL-запрос, который выводит таблицу остатков за весь период, за который нам известны проводки убери из своего запроса sysdate и добавь min/max дата проводки
авторИ еще написать SQL запрос, который выведет остатки на каждый день
group by BUSINESS_DT
...
Рейтинг: 0 / 0
Сложность с решением задач
    #40052857
robot_sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй, спасибо за совет.

Но не до конца понимаю как реализовать твои комментарии?
...
Рейтинг: 0 / 0
Сложность с решением задач
    #40052903
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
robot_sam

Вот код, который работает и выполняет поставленную задачу.
WITH test AS (SELECT ACCOUNT_DEBIT_ID as a, -POSTING_AMT as m FROM t WHERE BUSINESS_DT <= sysdate
UNION ALL
SELECT ACCOUNT_CREDIT_ID as a, POSTING_AMT as m FROM t WHERE BUSINESS_DT <= sysdate)
SELECT a, sysdate, sum(m)
FROM test
GROUP BY 1
ORDER BY 1


GROUP BY 1


остатки на конец дня когда был оборот, дальше допилете (или пишите что не получилось)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SQL> ed
Wrote file afiedt.buf

  1  with t (BUSINESS_DT,ACCOUNT_DEBIT_ID,ACCOUNT_CREDIT_ID,POSTING_AMT) as(
  2  select date '2020-03-10', 1, 2, 1000 from dual union all
  3  select date '2020-03-10', 2, 1, 100 from dual union all
  4  select date '2020-03-10', 3, 1, 200 from dual union all
  5  select date '2020-03-15', 2, 1, 150 from dual union all
  6  select date '2020-03-19', 2, 3, 100 from dual union all
  7  select date '2020-03-20', 3, 2, 50 from dual)
  8  , tt as ( --unpilot
  9  select
 10    BUSINESS_DT
 11   ,decode(f,-1,ACCOUNT_DEBIT_ID,1,ACCOUNT_CREDIT_ID) acn
 12   ,POSTING_AMT*f s
 13  from t,(select -1 f from dual union all select 1 from dual) u
 14  )
 15  select
 16   acn
 17   ,BUSINESS_DT dt_from
 18   ,lead(BUSINESS_DT-1,1,date'2099-12-31') over (partition by acn order by BUSINESS_DT) dt_to
 19   ,sum(s) saldo
 20  from tt
 21  group by acn,BUSINESS_DT
 22* order by 1,2
SQL> /

       ACN DT_FROM    DT_TO           SALDO
---------- ---------- ---------- ----------
         1 10.03.2020 14.03.2020       -700
         1 15.03.2020 31.12.2099        150
         2 10.03.2020 14.03.2020        900
         2 15.03.2020 18.03.2020       -150
         2 19.03.2020 19.03.2020       -100
         2 20.03.2020 31.12.2099         50
         3 10.03.2020 18.03.2020       -200
         3 19.03.2020 19.03.2020        100
         3 20.03.2020 31.12.2099        -50

9 rows selected.



.....
stax
...
Рейтинг: 0 / 0
Сложность с решением задач
    #40053806
robot_sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Большое спасибо, очень помогло!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сложность с решением задач
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]