Создайте новый столбец, который должен обрабатывать сумму существующего значения столбца в последовательности

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть следующие столбцы в таблице:

Название продукта Количество

Я хочу добавить количество продукта, если название продукта такое же. Например, если у меня есть продукт с одним и тем же именем дважды, я хочу, чтобы общее количество продуктов было добавлено и получил результат.

Это таблица, и я хочу добавить количества одного и того же элемента:

текущие данные в таблице

 Name            Quantity
Pen              3 
Pencil           2
Pen              6
Eraser           7
Eraser           6
  

Ожидаемый результат:

 Name                   Quantity         New Column
Pen                        3               3
Pen                        6               9 
Pencil                     2               2
Eraser                     7               7
Eraser                     6              13
  

Комментарии:

1. Я не понимаю ваш вывод. Вы хотите, чтобы текущий итог или количество были сгруппированы по имени? Если вы сгруппируете по имени, то вы получите, например, «Ручка 9»

2. Мне нужен текущий итог. Предположим, что новая строка добавлена как Pen 4, тогда вывод для этой строки должен быть Pen 4 13

3. -1 за отсутствие каких-либо исследовательских усилий

4. привет, Виньеш, спасибо за ответ. Попытка выполнить это в w3schools в таблице products не смогла запустить его там должным образом. Нужно попробовать только в понедельник.

5. Привет, Виньеш, спасибо, что все сработало, как ожидалось

Ответ №1:

Для достижения этого вам нужно использовать ROWNUM И Sum с Partition

Может быть что-то вроде этого

 SELECT Name,
       Quantity,
       SUM(Quantity) Over (Partition By Name Order By ROWNUM) As Sum_Value
From Table1
Order By Name Desc;
  

Демонстрация скрипки


Вывод:

 NAME    QUANTITY    SUM_VALUE
-----------------------------
Pencil  2           2
Pen     3           3
Pen     6           9
Eraser  7           7
Eraser  6           13
  

Комментарии:

1. Или без ROWNUM: СУММА (количество) превышена (Разделите по порядку имен по имени, неограниченному предыдущими строками) Как Sum_Value

Ответ №2:

Вы можете добавить триггеры insert, update и delete, которые обрабатывают обновление этого нового столбца. Пример (непроверенный):

 CREATE OR REPLACE TRIGGER X
   BEFORE INSERT ON T
   FOR EACH ROW
BEGIN
    set new.total_quantity := ( select sum(Quantity) from T
                                where name = :new.name )   :new.quantity
END;
/
  

Для заполнения существующих строк используйте решение Vignesh

Комментарии:

1. Каждая новая строка получит значение, соответствующее сумме предыдущих. Обратите внимание, что это происходит только при вставке новой строки. Триггеры для удаления и обновления имени должны быть реализованы для. Это иногда называют системой (системами) инкрементной оценки. Как уже упоминалось, вам нужно будет заполнить существующие строки, используя что-то похожее на Vignesh.

2. Возможно, было бы эффективнее: ` установить new.total_quantity := ( выберите coalesce(max(total_Quantity),0) из T, где name = :new.name ) :новое.количество`