2012-11-08 33 views
2

我想要查詢Oracle中的審計表以提取列表,瞭解給定時間範圍內文檔的流行度(唯一匹配數)。Oracle SQL - 如何分組和彙總結果?

是我到目前爲止已經開發的SQL是:

select distinct dt.name "Document name", ku.name "User name", count(*) "Number of hits" 
    from dauditnew da, 
     kuaf ku, 
     dtree dt 
where ku.id=da.performerid 
    and (da.auditstr='Fetch') 
    and dt.dataid = ANY(DOCID1,DOCID2) 
    and da.dataid = ANY(DOCID1,DOCID2) 
    and da.auditdate between TO_DATE('01-JAN-12') and TO_DATE('31-OCT-12') 
group by dt.name, ku.name 

它類似的數據吐出來:

Document name  User name   Hit count 
document1.pdf rimnet\user1 1 
document1.pdf rimnet\user2 1 
document1.pdf rimnet\user3 17 
document1.pdf rimnet\user4 1 
document2.pdf rimnet\user5 1 
document1.pdf rimnet\user6 1 
document3.pdf rimnet\user7 1 

但我真正需要的是爲它的組和結果統計每個唯一用戶一次:

Document name  User name   Hit count 
document1.pdf  n/a     5 
document2.pdf  n/a     1 
document3.pdf  n/a     1 

任何人都可以指向正確的方向嗎?

回答

2

基於你想要的結果,這聽起來像你只需要一個用戶數而不是點擊次數(否則,聚合17次命中+ 1次命中+ 1次命中+ 1是沒有意義的命中+1命中,最終命中5次)。如果是這樣的話

select dt.name "Document name", count(distinct ku.name) "Distinct users" 
    from dauditnew da, 
     kuaf ku, 
     dtree dt 
where ku.id=da.performerid 
    and (da.auditstr='Fetch') 
    and dt.dataid = ANY(DOCID1,DOCID2) 
    and da.dataid = ANY(DOCID1,DOCID2) 
    and da.auditdate between TO_DATE('01-JAN-12') and TO_DATE('31-OCT-12') 
group by dt.name 
+0

感謝賈斯汀的迴應!這絕對與我正在尋找的更接近,但它似乎報告了兩行的最大值。輸出說DOC1和DOC2都有3個命中,但實際上它是1和3.任何想法爲什麼? – user1810156

+0

@ user1810156 - 你可以發佈一個自包含的,可運行的例子,向我們展示問題嗎?發佈DDL以創建表格(剝離到在問題中發揮作用的列),發佈DML以使用數據填充表格,發佈查詢實際正在生成的輸出,並向我們顯示所需的輸出。否則,我們必須猜測表中的數據實際是什麼樣子。 –