Применение процентного изменения на основе уникального идентификатора - PullRequest
0 голосов
/ 11 ноября 2019

Я рассчитываю наценки из таблицы продаж в SQL, и мне нужно уменьшить объемы продаж, если в продаже есть скидка на основе номера счета-фактуры. Для этого образца применяется скидка 25%. Счет-фактура 123. Общая сумма продаж для счета-фактуры 123 составляет 100,00 долл. США, однако к этой сумме применяется скидка 25%. Я хочу применить скидку 25% ко всем номерам продаж для счета-фактуры 123, чтобы я мог получить фактический номер дохода.

Образцы данных:

ID            Type              ProductType       Amount
123           Sale               Jeans            50.00  
123           Sale               T-Shirt          30.00  
123           Sale               Sock             20.00   
123           Discount - 25%     NULL            -25.00

456           Sale               Jeans            60.00  
456           Sale               T-Shirt          40.00  
456           Sale               Sock             70.00   

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

ID            Type            ProductType       Amount      Actual Amount
123           Sale               Jeans            50.00          41.67
123           Sale               T-Shirt          30.00          21.67
123           Sale               Sock             20.00          11.67
123           Discount - 25%     NULL            -25.00          0.00

456           Sale               Jeans            60.00          60.00
456           Sale               T-Shirt          40.00          40.00
456           Sale               Sock             70.00          70.00

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

1 Ответ

0 голосов
/ 12 ноября 2019

Одним из способов является использование оконных функций для вычисления суммы отрицательных значений для id, деленной на число неотрицательных значений для этого выражения id на CASE в качестве аргументов функций. Результат деления может быть вычтен из цены. Дополнительно используйте CASE, чтобы получить ноль для отрицательных значений.

SELECT t1.id,
       t1.amount,
       CASE 
         WHEN t1.amount <= 0 THEN
           0
         ELSE t1.amount
              + sum(CASE
                      WHEN t1.amount < 0 THEN
                        t1.amount
                      ELSE
                        0
                    END) OVER (PARTITION BY t1.id)
              /
              count(CASE
                      WHEN t1.amount >= 0 THEN
                        1
                    END)  OVER (PARTITION BY t1.id)
       END actual_amount
       FROM elbat t1;

db <> fiddle

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