我在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执行此操作的任何想法?
如果它可以是动态的"那将是件好事。即,以便将月,季度和年份硬编码到查询中。
由于
答案 0 :(得分:1)
对于动态解决方案,您需要创建一个季度查找表,并将每个季度与一个月相关联。然后,您可以加入该表或使用相关子查询。
以下是您希望使用group by
和count
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