在一个sql语句中使用COUNT, AVG和Having从表中制表数据



我正在使用oracle developer。我有一个要求,我要把这些条件的数据制成表格。

  1. 书被借了几次
  2. 平均借贷期限是多少
  3. 谁是它最喜欢的读者。(如果有两个人作为最喜欢的读者呢?)

我有借方表。

EMPLID    BOOK_ID       BORROW_DT   RETURN_DT 
---------------------------------------------
00000058    6           17-JUL-14   31-JUL-14
00000015    6           17-JUL-14   31-JUL-14
00000001    1           16-JUL-14   30-JUL-14
00000004    1           16-JUL-14   30-JUL-14
00000009    5           16-JUL-14   30-JUL-14
00000010    5           16-JUL-14   30-JUL-14
00000044    5           16-JUL-14   30-JUL-14
00000002    1           15-JUL-14   15-JUL-14
00000008    1           16-JUL-14   30-JUL-14
00000014    1           16-JUL-14   30-JUL-14
00000007    5           16-JUL-14   30-JUL-14
00000003    1           16-JUL-14   30-JUL-14
00000004    5           15-JUL-14   29-JUL-14
00000006    1           15-JUL-14   15-JUL-14
00000009    1           15-JUL-14   29-JUL-14
00000009    2           15-JUL-14   29-JUL-14
00000010    1           15-JUL-14   29-JUL-14
00000010    2           15-JUL-14   29-JUL-14
00000011    1           15-JUL-14   29-JUL-14
00000011    2           15-JUL-14   29-JUL-14
00000012    2           15-JUL-14   15-JUL-14
00000044    1           16-JUL-14   30-JUL-14
00000003    2           16-JUL-14   30-JUL-14
00000004    2           16-JUL-14   30-JUL-14
00000001    2           14-JUL-14   14-JUL-14
00000001    1           14-JUL-14   14-JUL-14
00000001    5           14-JUL-14   28-JUL-14
00000005    2           15-JUL-14   29-JUL-14
00000007    2           15-JUL-14   29-JUL-14
00000007    1           15-JUL-14   17-JUL-14
00000008    2           15-JUL-14   29-JUL-14
00000008    5           15-JUL-14   29-JUL-14
00000013    2           15-JUL-14   29-JUL-14
00000011    2           17-JUL-14   31-JUL-14

根据要求,我有sql语句。

select DISTINCT 
    xyz_book_id_f, 
    count(book_id), 
    TRUNC(sum(RETURN_DT - BORROW_DT)/ count(book_id), 2) as AverageDuration,
    emplid 
from ps_xyz_borrow09 
group by book_id,emplid  
having count (book_id) > 1;

结果是

BOOK_ID   COUNT(BOOK_ID)  AVERAGEDURATION       EMPLID
-------------------------------------------------------
1          2                7                  00000001
2          2                14                 00000009
2          2                14                 00000011

它不显示没有最喜欢的读者的book_id。我有Book_ID:1,2,5,6。所以我想要显示所有的书id,不管book_id是否没有最喜欢的读者。

您的查询不正确。它是在book_id/emplid级别,而不是在书级别。你可以得到你想要的:

select xyz_book_id_f, count(book_id) as NumTimesBorrowed, 
       TRUNC(avg(RETURN_DT - BORROW_DT), 2) as AverageDuration,
       stats_mode(emplid) as MostCommonBorrower
from ps_xyz_borrow09 
group by book_id;

查询说明:

  • 移除select distinct。对于group by查询,这几乎不需要。
  • 它只按book_id进行聚合,因为这是结果的级别。
  • 使用avg()函数,比求和除以计数方便。
  • 它使用stats_mode()来获得最常见的值(或几个等效模式之一)。最常见的值在统计学中称为"mode"。

最新更新