Увеличение / уменьшение данных на основе текущего подсчета для сценария выдачи книг с использованием Oracle SQL - PullRequest
0 голосов
/ 01 августа 2020

У меня есть сценарий, который нужно обработать в Oracle SQL - это требование.

Это сценарий выдачи книг, который я пытаюсь создать.

  • Каждый ученик имеет право только на определенное количество книг, основанное на кредитной системе. В этом примере студенческий билет «100» предназначен для 4 книг.
  • Необходимо сгенерировать количество книг, которые студент проверил до указанной даты.
  • Данные под заголовком столбца «#Active Books под этим студентом "- это то, что я пытаюсь достичь с помощью SQL
  • . В некоторых случаях записи могут быть недействительными из-за неверных данных сканирования штрих-кода - в этих случаях нам нужно поддерживать тот же счетчик, что и студент имеет право на. Это доступно в заголовке столбца «Периодическое обновление» и «Статус обновления»

Может ли кто-нибудь помочь мне создать Oracle SQL для получения данных в заголовке столбца «#Active Books под этим учеником "?

Спасибо, Лакшминарасу Чендури

+------------+-----------+---------+------------+--------------------------------+----------------------------------+------------------+----------------+
| Student ID |   Date    | Book ID | Check Out? | Total Books that can be issued | #Active Books under this student | Recurring Update | Update Status  |
+------------+-----------+---------+------------+--------------------------------+----------------------------------+------------------+----------------+
|        101 | 14-Apr-20 |       2 | N          |                              4 |                                1 |                  |                |
|        101 | 17-Apr-20 |       2 | Y          |                              4 |                                0 |                  |                |
|        101 | 17-Apr-20 |       4 | N          |                              4 |                                1 |                  |                |
|        101 | 24-Apr-20 |       1 | N          |                              4 |                                2 |                  |                |
|        101 | 24-Apr-20 |       3 | N          |                              4 |                                3 |                  |                |
|        101 | 24-Apr-20 |       4 | Y          |                              4 |                                2 |                  |                |
|        101 | 27-Apr-20 |       1 | Y          |                              4 |                                1 |                  |                |
|        101 | 27-Apr-20 |       3 | Y          |                              4 |                                0 |                  |                |
|        101 | 27-Apr-20 |       4 | N          |                              4 |                                1 |                  |                |
|        101 | 1-May-20  |       1 | N          |                              4 |                                2 |                  |                |
|        101 | 1-May-20  |       2 | N          |                              4 |                                3 |                  |                |
|        101 | 1-May-20  |       4 | Y          |                              4 |                                2 |                  |                |
|        101 | 3-May-20  |       3 | N          |                              4 |                                3 |                  |                |
|        101 | 3-May-20  |       4 | N          |                              4 |                                4 |                  |                |
|        101 | 4-May-20  |       2 | Y          |                              4 |                                3 |                  |                |
|        101 | 4-May-20  |       4 | Y          |                              4 |                                2 |                  |                |
|        101 | 8-May-20  |       1 | Y          |                              4 |                                1 |                  |                |
|        101 | 10-May-20 |       2 | N          |                              4 |                                2 |                  |                |
|        101 | 10-May-20 |       3 | Y          |                              4 |                                1 |                  |                |
|        101 | 17-May-20 |       1 | N          |                              4 |                                2 |                  |                |
|        101 | 18-May-20 |       1 | Y          |                              4 |                                1 |                  |                |
|        101 | 18-May-20 |       2 | Y          |                              4 |                                0 |                  |                |
|        101 | 18-May-20 |       4 | N          |                              4 |                                1 |                  |                |
|        101 | 19-May-20 |       3 | N          |                              4 |                                2 |                  |                |
|        101 | 19-May-20 |       4 | Y          |                              4 |                                1 |                  |                |
|        101 | 22-May-20 |       3 | Y          |                              4 |                                0 |                  |                |
|        101 | 22-May-20 |       4 | N          |                              4 |                                1 |                  |                |
|        101 | 27-May-20 |       3 | N          |                              4 |                                2 |                  |                |
|        101 | 27-May-20 |       4 | Y          |                              4 |                                1 |                  |                |
|        101 | 28-May-20 |       2 | N          |                              4 |                                2 |                  |                |
|        101 | 28-May-20 |       3 | Y          |                              4 |                                1 |                  |                |
|        101 | 7-Jun-20  |       1 | N          |                              4 |                                2 |                  |                |
|        101 | 7-Jun-20  |       2 | N          |                              4 |                                3 |                  |                |
|        101 | 9-Jun-20  |       4 | N          |                              4 |                                4 |                  |                |
|        101 | 14-Jun-20 |       1 | N          |                              4 |                                4 |                5 | INVALID UPDATE |
|        101 | 14-Jun-20 |       4 | N          |                              4 |                                4 |                6 | INVALID UPDATE |
|        101 | 15-Jun-20 |       1 | Y          |                              4 |                                3 |                  |                |
|        101 | 15-Jun-20 |       4 | N          |                              4 |                                4 |                  |                |
|        101 | 28-Jun-20 |       3 | N          |                              4 |                                4 |                5 | INVALID UPDATE |
|        101 | 28-Jun-20 |       4 | Y          |                              4 |                                3 |                  |                |
|        101 | 29-Jun-20 |       2 | N          |                              4 |                                4 |                  |                |
|        101 | 29-Jun-20 |       3 | Y          |                              4 |                                3 |                  |                |
|        101 | 2-Jul-20  |       1 | N          |                              4 |                                4 |                  |                |
|        101 | 2-Jul-20  |       2 | N          |                              4 |                                4 |                5 | INVALID UPDATE |
|        101 | 6-Jul-20  |       1 | Y          |                              4 |                                3 |                  |                |
|        101 | 6-Jul-20  |       2 | N          |                              4 |                                4 |                  |                |
|        101 | 23-Jul-20 |       2 | N          |                              4 |                                4 |                5 | INVALID UPDATE |
|        101 | 24-Jul-20 |       1 | N          |                              4 |                                4 |                6 | INVALID UPDATE |
|        101 | 24-Jul-20 |       2 | N          |                              4 |                                4 |                7 | INVALID UPDATE |
|        101 | 28-Jul-20 |       1 | Y          |                              4 |                                3 |                  |                |
|        101 | 28-Jul-20 |       2 | N          |                              4 |                                2 |                  |                |
+------------+-----------+---------+------------+--------------------------------+----------------------------------+------------------+----------------+

1 Ответ

0 голосов
/ 01 августа 2020

Это можно сделать, используя текущую СУММ. Не хватает одной информации. Вы предполагаете, что данные хранятся в указанном вами порядке, но это не фиксируется ни в одном столбце. Итак, для моего примера я добавил столбец transaction_id. Теперь я могу гарантировать такой же порядок в избранном. Если столбец даты будет содержать временную часть (что, вероятно, есть, но это не включено в выборку данных), тогда ORDER BY dt) будет достаточно.

create table so_students
(student_id NUMBER,
 dt DATE,
 book_id NUMBER,
 checkout VARCHAR2(1),
 total_books NUMBER,
 active_books NUMBER,
 recurring_update NUMBER,
 update_status  VARCHAR2(100),
 transaction_id NUMBER
);

create sequence so_students_s;

INSERT INTO so_students values (101,TO_DATE('14-Apr-20','DD-Mon-YY'),   2,'N', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('17-Apr-20','DD-Mon-YY'),   2,'Y', 4, 0,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('17-Apr-20','DD-Mon-YY'),   4,'N', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('24-Apr-20','DD-Mon-YY'),   1,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('24-Apr-20','DD-Mon-YY'),   3,'N', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('24-Apr-20','DD-Mon-YY'),   4,'Y', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('27-Apr-20','DD-Mon-YY'),   1,'Y', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('27-Apr-20','DD-Mon-YY'),   3,'Y', 4, 0,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('27-Apr-20','DD-Mon-YY'),   4,'N', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('1-May-20','DD-Mon-YY'),    1,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('1-May-20','DD-Mon-YY'),    2,'N', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('1-May-20','DD-Mon-YY'),    4,'Y', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('3-May-20','DD-Mon-YY'),    3,'N', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('3-May-20','DD-Mon-YY'),    4,'N', 4, 4,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('4-May-20','DD-Mon-YY'),    2,'Y', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('4-May-20','DD-Mon-YY'),    4,'Y', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('8-May-20','DD-Mon-YY'),    1,'Y', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('10-May-20','DD-Mon-YY'),   2,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('10-May-20','DD-Mon-YY'),   3,'Y', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('17-May-20','DD-Mon-YY'),   1,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('18-May-20','DD-Mon-YY'),   1,'Y', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('18-May-20','DD-Mon-YY'),   2,'Y', 4, 0,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('18-May-20','DD-Mon-YY'),   4,'N', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('19-May-20','DD-Mon-YY'),   3,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('19-May-20','DD-Mon-YY'),   4,'Y', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('22-May-20','DD-Mon-YY'),   3,'Y', 4, 0,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('22-May-20','DD-Mon-YY'),   4,'N', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('27-May-20','DD-Mon-YY'),   3,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('27-May-20','DD-Mon-YY'),   4,'Y', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('28-May-20','DD-Mon-YY'),   2,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('28-May-20','DD-Mon-YY'),   3,'Y', 4, 1,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('7-Jun-20','DD-Mon-YY'),    1,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('7-Jun-20','DD-Mon-YY'),    2,'N', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('9-Jun-20','DD-Mon-YY'),    4,'N', 4, 4,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('14-Jun-20','DD-Mon-YY'),   1,'N', 4, 4,5,'INVALID UPDATE',so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('14-Jun-20','DD-Mon-YY'),   4,'N', 4, 4,6,'INVALID UPDATE',so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('15-Jun-20','DD-Mon-YY'),   1,'Y', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('15-Jun-20','DD-Mon-YY'),   4,'N', 4, 4,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('28-Jun-20','DD-Mon-YY'),   3,'N', 4, 4,5,'INVALID UPDATE',so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('28-Jun-20','DD-Mon-YY'),   4,'Y', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('29-Jun-20','DD-Mon-YY'),   2,'N', 4, 4,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('29-Jun-20','DD-Mon-YY'),   3,'Y', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('2-Jul-20','DD-Mon-YY'),    1,'N', 4, 4,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('2-Jul-20','DD-Mon-YY'),    2,'N', 4, 4,5,'INVALID UPDATE',so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('6-Jul-20','DD-Mon-YY'),    1,'Y', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('6-Jul-20','DD-Mon-YY'),    2,'N', 4, 4,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('23-Jul-20','DD-Mon-YY'),   2,'N', 4, 4,5,'INVALID UPDATE',so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('24-Jul-20','DD-Mon-YY'),   1,'N', 4, 4,6,'INVALID UPDATE',so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('24-Jul-20','DD-Mon-YY'),   2,'N', 4, 4,7,'INVALID UPDATE',so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('28-Jul-20','DD-Mon-YY'),   1,'Y', 4, 3,NULL,NULL,so_students_s.NEXTVAL);
INSERT INTO so_students values (101,TO_DATE('28-Jul-20','DD-Mon-YY'),   2,'N', 4, 2,NULL,NULL,so_students_s.NEXTVAL);

SELECT SUM(
  CASE update_status
    WHEN 'INVALID UPDATE' THEN
      0
    ELSE
      CASE checkout
        WHEN 'N' THEN
          1
        ELSE
          - 1
      END
  END
) OVER(
 ORDER BY dt,transaction_id) AS running_sum,
       active_books,
       s.*
  FROM so_students s;
...