Oracle SQL - 如何分组和汇总结果?

时间:2012-11-08 18:36:41

标签: sql oracle group-by

我正在尝试查询Oracle中的审计表,以提取一个文档在给定时间范围内的流行程度列表(唯一命中数)。

到目前为止我开发的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

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分: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