根据条件将行转换为列
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 获得结果后,我已经编辑了我的需求。我提前道歉。以上是关于根据条件将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章