Преобразование строки в столбец в зависимости от Conditon - PullRequest
0 голосов
/ 04 августа 2020

У меня есть таблица Table1

ID      ItemNbr      Seq    ClassNbr    Descr           Amount  ItmNbrSrc
E0001   00000000001  001    10143       Physics         1000    
E0001   00000000002  001    10144       Chemistry       1200    
E0001   00000000003  001    10145       Biology         1500    
E0001   00000000004  001    10143       Discount 01     100 
E0001   00000000005  001    10144       Discount 02     200 
E0001   00000000006  001                VAT             50      00000000001
E0001   00000000007  001                VAT             60      00000000002
E0001   00000000008  001                VAT             75      00000000003
E0001   00000000001  002    10143       Physics         1100    
E0001   00000000002  002    10144       Chemistry       1300    
E0001   00000000003  002    10145       Biology         1700    
E0001   00000000006  002                VAT             70      00000000001
E0001   00000000007  002                VAT             80      00000000002
E0001   00000000008  002                VAT             95      00000000003
E0001   00000000009  001                TOEFL           100
EOOO1   00000000010  001                VAT             5       00000000009  

Товары со скидкой всегда имеют Descr, начинающийся с «Discount»

Я хочу напечатать значения скидок в другом столбце для этого ClassNbr и значения НДС в другом столбце, который зависит от ItmNbrSr c Товары со скидкой имеют только один экземпляр на ClassNbr. Мы можем иметь ClassNbr несколько раз, однозначно идентифицируемый ItemNbr + Seq

ID      itemNbr     Seq   ClassNbr  Descr       Amount  Discount    VAT 
E0001   00000000001 001   10143     Physics     1000    100         50  
E0001   00000000002 001   10144     Chemistry   1200    200         60  
E0001   00000000003 001   10145     Biology     1500    0           75
E0001   00000000001 002   10143     Physics     1100    130         0   
E0001   00000000002 003   10144     Chemistry   1300    220         0   
E0001   00000000003 004   10145     Biology     1700    0           0
E0001   00000000010 001             TOEFL       100     0           5
    

Я пробовал использовать Max (декодировать) с Group By, но, похоже, это не сработало.

1 Ответ

1 голос
/ 04 августа 2020

Вы можете использовать оконные функции, чтобы повторно назначить номер класса VAT строк, а затем условное агрегирование для поворота набора результатов:

select
    id,
    max(itemNbr) itemNbr,
    newClassNbr,
    max(case when descr <> 'VAT' and descr not like 'Discount%' then descr end) descr,
    max(case when descr <> 'VAT' and descr not like 'Discount%' then amount end) amount,
    max(case when descr like 'Discount%' then amount end) discount,
    max(case when descr = 'VAT' then amount end) vat
from (
    select
        t.*,
        coalesce(classNbr, max(classNbr) over(partition by id, coalesce(ItmNbrSrc, ItemNbr))) newClassNbr
    from mytable t
) t
group by id, newClassNbr
order by 2

Демонстрация на DB Fiddle :

ID    | ITEMNBR | NEWCLASSNBR | DESCR     | AMOUNT | DISCOUNT | VAT
:---- | ------: | :---------- | :-------- | -----: | -------: | --:
E0001 |       6 | 10143       | Physics   |   1000 |      100 |  50
E0001 |       7 | 10144       | Chemistry |   1200 |      200 |  60
E0001 |       8 | 10145       | Biology   |   1500 |     <em>null</em> |  75
...