根据条件将行转换为列

Posted

技术标签:

【中文标题】根据条件将行转换为列【英文标题】:Convert a row to column depending on Conditon 【发布时间】:2020-08-04 14:55:06 【问题描述】:

我有一张桌子 表1

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 始终以“折扣”开头

我想针对 ClassNbr 打印另一列中的折扣值 以及取决于 ItmNbrSrc 的另一列中的增值税值 每个 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(decode) 与 Group By 一起使用,但它似乎不起作用。

【问题讨论】:

【参考方案1】:

您可以使用窗口函数重新分配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

Demo on DB Fiddle

身份证 |项目BR | NEWCLASSNBR |描述 |数量 |折扣 |增值税 :---- | ------: | :------------ | :-------- | -----: | --------: | --: E0001 | 6 | 10143 |物理学 | 1000 | 100 | 50 E0001 | 7 | 10144 |化学 | 1200 | 200 | 60 E0001 | 8 | 10145 |生物学 | 1500 | | 75

【讨论】:

在从您的 SQL 获得结果后,我已经编辑了我的需求。我提前道歉。

以上是关于根据条件将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

如何根据日期列将行转换为列?

Mysql查询根据两列动态将行转换为列

如何使用 Postgresql 将行转换为列?

MySQL - 根据每列的最新日期和 id 列表将行转换为列

使用 PIVOT 将行转换为列

将行转换为列