如何使用oracle编写查询以在一行中显示同一表中具有不同别名列名的两行

如何使用oracle编写查询以在一行中显示同一表中具有不同别名列名的两行,oracle,Oracle,我需要显示同一个表中具有不同列名的两行。一个作为当前列,另一个作为以前的列。如何在一行中显示它 SELECT BILL_ID CUR_BILL_ID, BILL_START_DT CUR_BILL_START_DT, BILL_END_DT CUR_BILL_END_DT, BILL_STATUS_CD CUR_BILL_STATUS_CD, BILL_APPROVED_BY CUR_BILL_APPROVED_BY, BILL_APPROVED_DT CUR_BILL_APPROVED_DT

我需要显示同一个表中具有不同列名的两行。一个作为当前列,另一个作为以前的列。如何在一行中显示它

SELECT BILL_ID CUR_BILL_ID, BILL_START_DT CUR_BILL_START_DT, BILL_END_DT CUR_BILL_END_DT, BILL_STATUS_CD CUR_BILL_STATUS_CD, BILL_APPROVED_BY CUR_BILL_APPROVED_BY, BILL_APPROVED_DT CUR_BILL_APPROVED_DT FROM FPM_CB_BILL_DETAILS WHERE BILL_ID =  (select max(BILL_ID) from FPM_CB_BILL_DETAILS)


SELECT BILL_ID PRV_BILL_ID, BILL_START_DT PRV_BILL_START_DT, BILL_END_DT PRV_BILL_END_DT, BILL_STATUS_CD PRV_BILL_STATUS_CD,  BILL_APPROVED_BY PRV_BILL_APPROVED_BY,  BILL_APPROVED_DT PRV_BILL_APPROVED_DT FROM FPM_CB_BILL_DETAILS WHERE BILL_ID =  (select max(BILL_ID) from FPM_CB_BILL_DETAILS) - 1

看起来selfjoin可能会有所帮助

SQL> with fpm_cb_bill_Details (bill_id, bill_status_cd) as
  2    (select 100, 'status A' from dual union all
  3     select 101, 'status B' from dual union all
  4     select 102, 'statuc C' from dual union all
  5     select 103, 'status D' from dual
  6    )
  7  select a.bill_id         curr_bill_id,
  8         a.bill_status_cd  curr_status,
  9         b.bill_id         prev_bill_id,
 10         b.bill_status_cd  prev_status
 11  from fpm_cb_bill_details a join fpm_cb_bill_details b on b.bill_id = a.bill_id - 1
 12  where a.bill_id = (select max(bill_id) from fpm_cb_bill_details);

CURR_BILL_ID CURR_STA PREV_BILL_ID PREV_STA
------------ -------- ------------ --------
         103 status D          102 statuc C

SQL>
您可以使用lag()分析函数查看前一行的列值,按bill_id排序如下:

FSITJA@db01> with fpm_cb_bill_Details (bill_id, bill_status_cd) as
  2   (select 100, 'status A' from dual union all
  3    select 101, 'status B' from dual union all
  4    select 102, 'statuc C' from dual union all
  5    select 103, 'status D' from dual
  6   )
  7   select d.bill_id         curr_bill_id,
  8          d.bill_status_cd  curr_status,
  9          lag(d.bill_id)        over (order by d.bill_id) prev_bill_id,
 10          lag(d.bill_status_cd) over (order by d.bill_id) prev_status
 11     from fpm_cb_bill_Details d;

CURR_BILL_ID CURR_STA PREV_BILL_ID PREV_STA
------------ -------- ------------ --------
         100 status A
         101 status B          100 status A
         102 statuc C          101 status B
         103 status D          102 statuc C
感谢@Littlefoot提供示例表数据