как использовать вложенный регистр с несколькими условиями в SQL - PullRequest
0 голосов
/ 11 ноября 2018

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

  • Total_Inc_Tax будет кол-во x unit_price с 5%, когда Issue_date между 1 января 2018 и 31 марта 2018 года, если LPO NULL или нет
  • После 31 марта 2018 года, когда LPO не равен NULL, не следует прибавлять 5% с Кол-во x unit_price В противном случае добавьте 5%.

    Как это работает с вложенным регистром или предложить другой способ.

my_table:

+------------+-----+------------+---------------+
| Issue_date | qty | unit_price |      LPO      |
+------------+-----+------------+---------------+
| 10-Jan-18  |   1 |         42 | 1-2018-001166 |
| 12-Jan-18  |   1 |        100 | NULL          |
| 20-Sep-18  |   1 |         25 | NULL          |
| 15-Oct-18  |   2 |         12 | 1-2018-002233 |
| 20-Oct-18  |   1 |        100 | 1-2018-002233 |
+------------+-----+------------+---------------+

SELECT Qty,unit_price,LPO,
    case
    when issue_date <= '2018-03-31'  and issue_date >= '2018-01-01'  
    then (((qty) *(unit_price))  * 1.05 )      
    else    
    (((qty) *(unit_price))  * 1.05 )
    end   as Tot_inc_Tax
    from  My_Table 

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

+------------+-----+------------+---------------+---------------+
| Issue_date | qty | unit_price |      LPO      | Total_Inc_Tax |
+------------+-----+------------+---------------+---------------+
| 10-Jan-18  |   1 |         42 | 1-2018-001166 |          44.1 |
| 12-Jan-18  |   1 |        100 | NULL          |           105 |
| 20-Sep-18  |   1 |         25 | NULL          |         26.25 |
| 15-Oct-18  |   2 |         12 | 1-2018-002233 |            24 |
| 20-Oct-18  |   1 |        100 | 1-2018-002233 |           100 |
+------------+-----+------------+---------------+---------------+

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Один из вариантов расчета будет:

with my_table(Issue_date, qty, unit_price, LPO) as  
(
 select '2018-01-10',1,42 ,'1-2018-001166' union all
 select '2018-01-12',1,100,NULL            union all
 select '2018-09-20',1,25 ,NULL            union all
 select '2018-10-15',2,12 ,'1-2018-002233' union all
 select '2018-10-20',1,100,'1-2018-002233'     
)
select Qty,unit_price,LPO,
       (case
          when issue_date between '2018-01-01' and '2018-03-31'  
            then (((qty) *(unit_price))  * 1.05 )      
          when issue_date > '2018-03-31' then
          ( case when lpo is null then
                 (((qty) *(unit_price))  * 1.05 )
            else
                 (((qty) *(unit_price))) 
            end )
        end ) as Tot_inc_Tax
  from  My_Table;

Демоверсия dbfiddle

0 голосов
/ 11 ноября 2018

Вы можете использовать это:

SELECT Qty,unit_price,LPO,
case
when issue_date between '2018-01-01' and '2018-03-31'  
then (((qty) *(unit_price))  * 1.05 )      
else   when  issue_date > '2018-03-31' and LPO is null
(((qty) *(unit_price))  * 1.05 )
end   as Tot_inc_Tax
from  My_Table 
0 голосов
/ 11 ноября 2018

По вашей логике вы можете попробовать это

  1. первое использование OR

  2. второй раз AND

И убедитесь, что все соответствует вашей логике.

SELECT Issue_date,Qty,unit_price,LPO,
    case
    when (issue_date BETWEEN '2018-01-01' AND '2018-06-30') OR unit_price IS NULL 
      THEN qty *LPO  * 1.05       
    when issue_date > '2018-03-31' AND unit_price IS NOT NULL 
      THEN qty * LPO  END 'Total_Inc_Tax'
from  My_Table 

sqlfiddle

...