2012-11-14 112 views
0

您好我有我在哪里从表中选择2个不同的日期列的选择查询,我需要将它们合并到一列中的结果和秩序按日期的降序排列。 查询看起来像以下:合并两个日期列在Oracle中的“选择”和排序的合并列

select work_order_no,install_remove_type,removed_item_id,installed_item_id, 
     removed_performed_on as irdate, 
     installed_performed_on as irdate 
    from install_remove_items 
where work_order_no is not null 
    and (installed_item_id = 'IID000174096' or removed_item_id= 'IID000174096') 

上述查询的结果是,有2列创建

irdate - 用于removed_performed_on

irdate_1 - 用于installed_performed_on

这不是我想要的方式it..How做我有相关的日期在“irdate” colu数据还有按desc顺序排序?

更新:在install_remove_items表

样本数据(在INSTALL_REMOVE_TYPE字段4个记录4动作类型):

ir_id: xxxxyyyy5555, install_remove_type= 'INSTALL', workOrderno = 22335522, installed_item_id = IID000174096, installed_performed_on = '11/10/2012', removed_item_id = null, removed_performed_on = null. 

ir_id: xxxxyyyy3333, install_remove_type= 'REMOVE', workOrderno = 223542, installed_item_id = null, installed_performed_on = null, removed_item_id = IID000174096, removed_performed_on = '11/12/2012'. 

ir_id: xxxxyyyy1111, install_remove_type= 'WORKEDON', workOrderno = 111111, installed_item_id = null, installed_performed_on = null, removed_item_id = IID000174096, removed_performed_on = '11/13/2012'. 

ir_id: xxxxyyyy2222, install_remove_type= 'REPLACED', workOrderno = 444444, installed_item_id = IID000174096, installed_performed_on = 11/15/2012, removed_item_id = IID000174096, removed_performed_on = '11/14/2012'. 

因此,有4种类型的动作, '删除' 字段填充为REMOVE动作,INSTALL动作的“安装”字段,REPLACED动作的两个字段和WORKEDON动作的“已删除”字段。

我想编写一个查询,以查找基于install_performed_on和removed_performed_on日期(并获取该日期)最后执行的四种操作中的哪种操作(与当前日期或输入日期值相比)。

希望这事情说清楚。

我知道工会可能是好的,但目前的Java API,我们有SQL犯规支持工会,所以我必须做的SQL和Java代码的组合来实现我的输出。

在此先感谢。

回答

1

它不是完全清楚你想要什么,你不把你想要的样本数据。但是会这样吗?

select * 
    from (select work_order_no,install_remove_type,installed_item_id, 
        installed_performed_on as irdate 
       from install_remove_items 
      where work_order_no is not null 
       and installed_item_id = 'IID000174096' 
      union all 
      select work_order_no,install_remove_type,removed_item_id, 
        removed_performed_on as irdate 
       from install_remove_items 
      where work_order_no is not null 
       and removed_item_id= 'IID000174096') 
     order by irdate desc; 

修改为按您的样本:

SQL> select * 
    2 from (select workOrderno, install_remove_type, 
    3     case 
    4     when installed_performed_on > removed_performed_on 
    5      or removed_performed_on is null then ir.installed_performed_on 
    6     else removed_performed_on 
    7     end last_action_date, 
    8     coalesce(ir.installed_item_id,ir.removed_item_id) item_id 
    9   from install_remove_items ir 
10   where workOrderno is not null 
11    and (installed_item_id = 'IID000174096' or removed_item_id= 'IID000174096') 
12   order by last_action_date desc) 
13 where rownum = 1 
14/

WORKORDERNO INSTALL_RE LAST_ACTI ITEM_ID 
----------- ---------- --------- -------------------- 
    444444 REPLACED 15-NOV-12 IID000174096 

或者你可以做这样的每个项目的列表:

SQL> select * from install_remove_items; 

IR_ID    INSTALL_RE WORKORDERNO INSTALLED_ITEM_ID INSTALLED REMOVED_ITEM_ID  REMOVED_P 
-------------------- ---------- ----------- -------------------- --------- -------------------- --------- 
xxxxyyyy5555   INSTALL  22335522 IID000174096   10-NOV-12 
xxxxyyyy3333   REMOVE   223542        IID000174096   12-NOV-12 
xxxxyyyy1111   WORKEDON  111111        IID000174096   13-NOV-12 
xxxxyyyy2222   REPLACED  444444 IID000174096   15-NOV-12 IID000174096   14-NOV-12 
3242     REMOVE    43        IID000174097   14-DEC-12 
123     INSTALL   123 IID000174097   15-NOV-12 

6 rows selected. 

SQL> select workorderno, install_remove_type, item_id, last_action_date 
    2 from (select l.*, 
    3     row_number() over(partition by item_id order by last_action_date desc) rn 
    4    from (select workorderno, install_remove_type, 
    5       case 
    6        when installed_performed_on > removed_performed_on or 
    7         removed_performed_on is null then 
    8        ir.installed_performed_on 
    9        else 
10        removed_performed_on 
11       end last_action_date, 
12       coalesce(ir.installed_item_id, ir.removed_item_id) item_id 
13      from install_remove_items ir 
14      where workorderno is not null) l) 
15 where rn = 1; 

WORKORDERNO INSTALL_RE ITEM_ID    LAST_ACTI 
----------- ---------- -------------------- --------- 
    444444 REPLACED IID000174096   15-NOV-12 
     43 REMOVE  IID000174097   14-DEC-12 
+0

谢谢,这是非常接近。我要的是在install_remove_items表就比较“installed_performed_on”和“removed_performed_on”今天的日期最近的记录(实际上该事件发生在去年 - 安装/删除)。想知道如果我们可以使这个查询简洁 –

+0

我认为这将有所帮助,如果你显示一些示例输入+输出数据,如果possisble。 – DazzaL

+0

请检查更新问题 –