Oracle多维查询

时间:2014-11-24 22:48:41

标签: sql oracle

我在Oracle数据库中有一个表,其中包含大量日期。简称LOG_DATE。 这是产生以下输出的查询:

SELECT *
FROM ITAR.LOG_ITEM 
WHERE ACTION='APPROVE' 

LOG_ITEM LOG_DATE              ACTION  REQUEST
1        2014-10-15 13:51:24.0 APPROVE POSTPONE
2        2014-11-18 14:54:47.0 APPROVE CLOSE
3        2014-11-18 15:55:47.0 APPROVE POSTPONE
4        2014-11-19 14:52:47.0 APPROVE CLOSE
5        2014-09-17 14:22:37.0 APPROVE POSTPONE

我想基于单个查询生成多维输出。 输出应该是这样的:

           THIS_MONTH THIS_QUARTER THIS_YEAR
POSTPONE            1            2         3
CLOSE               2            2         2

关于如何仅使用Oracle-SQL执行此操作的任何想法?

如果它可以是动态的"那将是件好事。即,以便将月,季度和年份硬编码到查询中。

由于

1 个答案:

答案 0 :(得分:1)

对于动态解决方案,您需要创建一个季度查找表,并将每个季度与一个月相关联。然后,您可以加入该表或使用相关子查询。

以下是您希望使用group bycount case的所需内容的基本概念:

select request, 
  count(case when trunc(log_date,'mm') = trunc(sysdate,'mm') then 1 end) this_month,
  count(case when extract(month from log_date) in (10,11,12) then 1 end) this_quarter,
  count(1) this_year
from log_item
where log_date >= to_date('1/1/2014','mm/dd/yyyy')
group by request

编辑:根据下面的@OllieJones评论,这实际上适用于您而无需使用季度查找表:

select request, 
  count(case when trunc(log_date,'mm') = trunc(sysdate,'mm') then 1 end) this_month,
  count(case when trunc(log_date,'Q') = trunc(sysdate,'Q') then 1 end) this_quarter,
  count(1) this_year
from log_item
where log_date >= trunc(sysdate,'yyyy')
group by request