Oracle 数据操作中经常遇见行变列的需求,即部分数据是按照行存储的, 但需求中需要将行以某一字段
为轴变为单行列式展示 (“轴” 即是 本来显示在行上的列,转而显示在列的名称, 即需要行转列的字段)
Oracle基础语法 (Pivot)
select 字段1,字段2,字段3,字段4,字段5 from
piovt(Max(字段2)AS XX, Max(字段3) --------pivot 中需要显示的值必须是聚合函数,这部分数据将显示在表格中, AS XX 别名将做为行名的后缀
for 字段1 ---------for 语句为pivot函数中属于轴的字段 该字段中得值或设定的别名将作为结果中的列名前缀
in (字段1行中具体的值 as 别名) ); -----in () 部分函数限定 for 字段1 中字段1的选值范围。如果值不固定,可以在select 中加入row_number() over(par....) 字段,以行号进行设定。
说明 1: Pivot函数中变为列的数据有in 中限定几个值 和 Pivot所聚合的字段决定,例, in中选定3个值,piovt中有2个字段, 最后的列数为 ( in中选中得值数 * pivot设定的字段),一共6列被列出
2: 未选中的字段如字段4,字段5将会自动进行去重操作, 即最小化最终行数。
举例:
某一XCL项目需要从instalment_head 中选定几期instal数据, 最终将这几期数据进行横向展示
基础代码
select t.SKP_CREDIT_CASE, t.DATE_INSTALMENT,t.DATE_PAY_INSTALMENT, t.DATE_PAY_LAST, rownum as rn from OWNER_DWH.F_INSTALMENT_HEAD_AD t
where t.SKP_CREDIT_CASE = '220096621'
and t.DATE_INSTALMENT > trunc(sysdate) +3
and t.DATE_INSTALMENT < add_months(trunc(sysdate) +3 , 4)
结果
SKP_CREDIT_CASE | DATE_INSTALMENT | DATE_PAY_INSTALMENT | DATE_PAY_LAST | RN | |
1 | 220096621 | 2018/11/1 | 2018/9/3 | 2018/9/3 | 1 |
2 | 220096621 | 2019/2/1 | 2018/9/8 | 2018/9/8 | 2 |
3 | 220096621 | 2018/12/1 | 2018/9/3 |