2014-11-24 59 views
0

我有一個Oracle數據庫中有大量日期的表。簡稱LOG_DATE。 這是產生下面的輸出中查詢:Oracle多維查詢

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

對於動態的解決方案,你需要創建一個季度查找表和每個季度用了一個月關聯。然後,您可以加入該表或使用相關的子查詢。

這裏有你想要的東西,雖然它使用group by的基本思路,並countcase

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下面發表評論,這實際上不需要任何理由就可以爲你工作rters查找表:

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 
+1

'TRUNC(LOG_DATE, 'Q')'實際上將產生季度截斷。所以,你可能不需要'(10,11,12)'東西。 – 2014-11-24 23:29:21

+0

@OllieJones - 我不知道,謝謝!更新了答案。 – sgeddes 2014-11-24 23:32:38