在查询

时间:2015-04-26 23:06:19

标签: oracle11g

我最近遇到了在select语句中使用2个CASE语句进行查看的问题。

假设我有一个名为login(emp_num,log_in_date,log_in_time)的表。

请注意,Log_in_date将包含“DD-MM-YY”格式的日期,而log_in_time将格式化为“24HH:MM:SS”

以下是单独运行时的两种情况:

根据一天中的时间计算登录尝试次数

select  count(*) as "Logins", Log_Time as "Time Of Day"
from (select(
CASE

when to_char(login.log_in_time, 'HH24:MI:SS') > '12:00:00' 
and to_char(login.log_in_time, 'HH24:MI:SS') <= '18:00:00' then 'Afternoon'

when to_char(login.log_in_time, 'HH24:MI:SS') > '18:00:00' 
and to_char(login.log_in_time, 'HH24:MI:SS') < '6:00:00' then 'Evening'

else 'Morning'
end ) as Log_Time from login)
group by  Log_Time;

结果:

Logins Time of Day            
   ___
13265   morning                   
16115   afternoon                 
6709   evening 

这是显示每个学期的登录尝试次数的第二个查询:

select  count(*) as "Logins", Semester
from (select(
CASE

when login.log_in_date >= '15-AUG-09' and login.log_in_date <= '18-DEC-09'    then 'Fall 2009'
when login.log_in_date >= '1-JAN-10' and login.log_in_date <= '15-MAY-10' then 'Spring 2010'

end ) as Semester from login)

group by  Semester;

结果:

Logins SEMESTER  
---------- -----------
16511 Spring 2010  
19578 Fall 2009 

我的问题是,如何在select语句中组合这两个CASE语句,以便结果如下:

  Logins Time of Day               Semester                
  8292 afternoon                 Fall 2009                 
  7823 afternoon                 Spring 2010               
  3623 evening                   Fall 2009                 
  3086 evening                   Spring 2010               
  7663 morning                   Fall 2009                 
  5602 morning                   Spring 2010  

我曾尝试将CASE放在where和from子句中,但似乎没有成功。

感谢。

1 个答案:

答案 0 :(得分:0)

SELECT COUNT(EMP_NUM) logins,

  Log_Time,

  Semester

FROM
  (SELECT emp_num,

    CASE

      WHEN TO_CHAR(login.log_in_time, 'HH24:MI:SS') > '12:00:00'

      AND TO_CHAR(login.log_in_time, 'HH24:MI:SS') <= '18:00:00'

      THEN 'Afternoon'

      WHEN TO_CHAR(login.log_in_time, 'HH24:MI:SS') > '18:00:00'

      AND TO_CHAR(login.log_in_time, 'HH24:MI:SS')  < '6:00:00'

      THEN 'Evening'

      ELSE 'Morning'

    END AS Log_Time,

    CASE
      WHEN login.log_in_date >= '15-AUG-09'

      AND login.log_in_date  <= '18-DEC-09'

      THEN 'Fall 2009'

      WHEN login.log_in_date >= '1-JAN-10'

      AND login.log_in_date  <= '15-MAY-10'

      THEN 'Spring 2010'

    END AS Semester

  FROM login
  )
GROUP BY Log_Time,

  Semester;