如果根据Oracle中日期范围的输入预订或未预订人员,则需要将状态列作为输出

时间:2016-02-17 07:18:13

标签: sql oracle grouping

我有一张表xxtab,其数据为

 NAME  | DATE_FROM  | DATE_TO
---------------------------------
 Rahul | 12/14/2015 | 12/18/2015 
 Rahul | 12/20/2015 | 12/21/2015 
 Divya | 12/29/2015 | 12/30/2015 
 Rahul | 12/22/2015 | 12/24/2015 

现在我需要一个列Status,根据输入日期范围输出为'Booked''Not Booked'。现在,如果对于特定的人,输入DATE_FROM和date_to属于表格中的日期范围,那么它应该将状态输出显示为“已预订”

假设我将输入作为

Date_from = '15-Dec-2015'
Date_to   = '19-Dec-2015'

然后我期待这个结果:

 NAME  | STATUS
--------------------
 Rahul | Booked
 Divya | Not Booked

即一个唯一名称,我只需要一条记录。

我尝试使用此查询:

select name,
       CASE                    
       WHEN (to_char('15-Dec-2015') between Date_from and Date_to                        
             OR to_char('19-Dec-2015') between Date_from and Date_to)                                        
       THEN 'Booked'                    
       ELSE 'Not Booked'                    
       END Status 
 from xxtab;

但是我为同一个人获得了多条记录。

 NAME  | STATUS
--------------------
Rahul  | Booked
Rahul  | Not Booked
Divya  | Not Booked
Rahul  | Not Booked

请帮帮我。

2 个答案:

答案 0 :(得分:0)

 select distinct(name), CASE                    
             WHEN (to_char('15-Dec-2015') between Date_from and Date_to                        
              OR to_char('19-Dec-2015') between Date_from and Date_to)                                        
              THEN 'Booked'                    
             ELSE 'Not Booked'                    
              END Status  from   demo1 ;

你可以试试这个。如果特定名称的状态输出是唯一的,它将检索唯一记录

答案 1 :(得分:0)

只需将MIN添加为'Booked'< '未预订':

select name,
   MIN(CASE                    
         WHEN DATE '2015-12-15' <= date_to
          AND DATE '2015-12-19' >= date_from                                        
         THEN 'Booked'                    
         ELSE 'Not Booked'                    
       END) Status 
from   xxtab
group by name

我更改了您的重叠逻辑(当您请求的范围是从13.12到31.12时,它会全部报告为“未预订”。)