带有条件的 Oracle SQL Pivot 将行转换为列

Posted

技术标签:

【中文标题】带有条件的 Oracle SQL Pivot 将行转换为列【英文标题】:Oracle SQL Pivot with Conditions convert rows to columns 【发布时间】:2021-02-13 17:52:53 【问题描述】:

我有一个包含以下数据的表 ITEM_SF

我想将数据转换为具有几个条件的列:

Emplid      Account_nbr Item_Type_cd   Item_Amt
K-215200145 BOOKS001    C               600
K-215200145 BOOKS001    P               -600
K-215200145 EXP001      P               0
K-215200145 HLT001      C               100
K-215200145 HLT001      P               -100
K-215200145 REGFEE001   C               500
K-215200145 REGFEE001   P               -500
K-215200145 SSC001      C               350
K-215200145 SSC001      P               -350
K-215200145 TUT001      C               10200
K-215200145 TUT001      P               -5545.19
K-215200145 TUT001      W               -1566
K-215200145 VAT001      C               587.5
K-215200145 VAT001      P               -392.56
K-215200145 VAT001      W               -40.5
K-215200211 BOOKS001    C               600
K-215200211 HLT001      C               100
K-215200211 REGFEE001   C               500
K-215200211 SSC001      C               350
K-215200211 TUT001      C               16800
K-215200211 VAT001      C               917.5
K-215200602 BOOKS001    C               900
K-215200602 BOOKS001    P               -150
K-215200602 HLT001      C               100
K-215200602 REGFEE001   C               500
K-215200602 REGFEE001   P               0
K-215200602 SSC001      C               350
K-215200602 SSC001      P               0
K-215200602 TUT001      C               15600
K-215200602 TUT001      W               -2340
K-215200602 VAT001      C               872.5
K-215200602 VAT001      P               -7.5
K-215200602 VAT001      W               -117

我想要的结果是显示费用、折扣、支付金额和税金 费用包括(书费、健康费、注册费、SSCF 费、学费、一般费)

Emplid      BookFees    HealthFees  RegistrationFees    SSCFees TuitionFees GeneralFees Discount    Fees Paid   VAT
K-215200145 600         100         500                 350     10200           0               1606.6      7848.7      587.5
K-215200211 600         100         500                 350     16800           0               0           0           917.5       
K-215200602 900         100         500                 350     15600           0               2457        157.5       872.5

收费

Where BookFees is where ACCOUNT_NBR =BOOKS001 
Health Fees is 100, SSCFees is 350 and RegistrationFees is 500. Tuition Fees is ITEM_AMT where ACCOUNT_NBR= TUT001, GeneralFees is ITEM_AMT where ACCOUNT_NBR=TUTPC001 and Item_type_cd = C (Charge) 

, 折扣 is Sum of ITEM_AMT where ITEM_TYPE_CD ='W' 已付费 is Sum of ITEM_AMT where ITEM_TYPE_CD ='P' 增值税为Sum of ITEM_AMT where ACCOUNT_NBR=VAT001 and ITEM_TYPE_CD ='C' (Aditionally VAT should always be Charges*0.05)

我尝试使用 Pivot,但无法获得所有提及的列

【问题讨论】:

【参考方案1】:

您可以使用条件聚合,这意味着使用case 表达式来定义应在每列中汇总哪些值:

select empid,
       sum(case when Account_nbr = 'BOOKS001' then item_amt else 0 end) as book_fees,
       sum(case when Account_nbr = 'HLT001' then item_amt else 0 end) as health_fees,
       sum(case when Account_nbr = 'REGFEE001' then item_amt else 0 end) as registration_fees,
       . . . -- for the remaining fees
from item_sf
group by empid;

【讨论】:

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

SQL Server - Pivot 将行转换为列(带有额外的行数据)

在 SQL 中使用“Pivot”将行转换为列

在 SQL Server 2012 中使用 Pivot 函数将行数据更改为列

在 SQL Pivot 上使用 Min 聚合

使用 Pivot 将行更改为列

BigQuery 标准 SQL 如何将行转换为列