2012-01-26 34 views
0

我有一個查詢,我運行在表TXN_DEC(id, resourceid, usersid, date, eventdesc)哪些返回給定的日期範圍和resourceid,按日期和eventdesc用戶的不同計數(每個資源可以有4 to 5 eventdesc)修改查詢結果集,以包括範圍內的所有日期

如果在該範圍內的某個日期沒有不同用戶數值,則對於eventdesc,則跳過結果集中的該日期行。

我需要在結果集或集合中包含所有日期行,以便如果日期中沒有計數值eventdesc組合,則其值設置爲0,但該日期仍然存在於集合中。

我如何去獲得這樣一個集合

我知道從查詢結果中得到最終的數據集完全是太複雜了, 但我可以使用集合在Groovy修改和填充我圖/表來獲得所需格式的數據

與以下內容類似G:如果

輸入日期範圍= 2月5日至3月3日2011年

 DataMap = [dateval: '02/05/2011' eventdesc: 'Read' dist_ucnt: 23, 
       dateval: '02/06/2011' eventdesc: 'Read' dist_ucnt: 23, 
       dateval: '02/07/2011' eventdesc: 'Read' dist_ucnt: 0, -> this row was not present in query resultset, but row exists in the map with value 0 
       ....and so on till 3 march 2011 and then whole range repeated for each eventdesc 
        ] 

回答

1

如果你想爲一個給定的範圍內的所有日期(包括那些在TXN_DEC表中沒有條目),你可以使用Oracle生成日期範圍,然後對現有查詢使用外部連接。那麼你只需要填充空值。喜歡的東西:

select 
    d.dateInRange as dateval, 
    'Read' as eventdesc, 
    nvl(td.dist_ucnt, 0) as dist_ucnt 
from (
    select 
     to_date('02-FEB-2011','dd-mon-yyyy') + rownum - 1 as dateInRange 
    from all_objects 
    where rownum <= to_date('03-MAR-2011','dd-mon-yyyy') - to_date('02-FEB-2011','dd-mon-yyyy') + 1 
) d 
left join (
    select 
     date, 
     count(distinct usersid) as dist_ucnt 
    from 
     txn_dec 
    where eventDesc = 'Read' 
    group by date 
) td on td.date = d.dateInRange 

這是我純粹的Oracle解決方案,因爲我不是一個Groovy的傢伙(當然,實際上,我是一個很時髦的傢伙...)

編輯:這裏是相同的版本在包裹一個存儲過程。如果你知道API,應該很容易打電話....

create or replace procedure getDateRange (
    p_begin_date IN DATE, 
    p_end_date IN DATE, 
    p_event IN txn_dec.eventDesc%TYPE, 
    p_recordset OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN p_recordset FOR 
    select 
     d.dateInRange as dateval, 
     p_event as eventdesc, 
     nvl(td.dist_ucnt, 0) as dist_ucnt 
    from (
     select 
      p_begin_date + rownum - 1 as dateInRange 
     from all_objects 
     where rownum <= p_end_date - p_begin_date + 1 
    ) d 
    left join (
     select 
      date, 
      count(distinct usersid) as dist_ucnt 
     from 
      txn_dec 
     where eventDesc = p_event 
     group by date 
    ) td on td.date = d.dateInRange; 
END getDateRange; 
+0

這看起來不錯,你有什麼機會知道如何使用hibernate(如HQL)。即使createCriteria API是好的...? –

+0

不,對不起,Hibernate沒有做太多的工作。 –

+0

好吧..我可以嘗試轉換上述解決方案,但唯一的問題是,事件desc可以是任何從(讀,寫,保存等)其不固定值'讀'因此我需要也由eventdesc分組。感謝您的幫助.. –