在一条sql语句中使用COUNT、AVG和Having将表中的数据制成表格

在一条sql语句中使用COUNT、AVG和Having将表中的数据制成表格,sql,oracle,Sql,Oracle,我正在使用oracle developer。我有一个要求,我要把这些条件的数据制成表格 这些书被借了多少次 平均借款期限是多少 谁是它最喜欢的读者。(如果有两个人作为最喜欢的读者呢?) 我有借桌 EMPLID BOOK_ID BORROW_DT RETURN_DT --------------------------------------------- 00000058 6 17-JUL-14 31-JUL-14 00000015 6

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

  • 这些书被借了多少次
  • 平均借款期限是多少
  • 谁是它最喜欢的读者。(如果有两个人作为最喜欢的读者呢?)
  • 我有借桌

    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
    
    它不会显示没有最喜欢的读者的图书id。 我有书号:1,2,5,6。所以我想显示所有的图书id,不管图书id是否没有最喜欢的阅读器


    任何帮助都将不胜感激。

    您的查询不正确。它位于
    图书id
    /
    员工id
    级别,而不是图书级别。您可以通过以下方式获得您想要的:

    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;
    
    有关此查询的说明:

    • 它删除
      选择distinct
      。对于
      groupby
      查询,这几乎是不需要的
    • 它只按
      book\u id
      进行聚合,因为这是结果的级别
    • 它使用
      avg()
      函数,这比总和除以计数更方便
    • 它使用
      stats\u mode()。统计中最常见的值称为“模式”

    • 看在上帝的份上,别喊了!什么是“人物代码”?谢谢@Gordon Linoff的帮助。它很好用。你的笔记也很清楚。谢谢你。