使用 group_by 在 Oracle sql 查询中生成一行

Produce one row in an Oracle sql query using group_by

我正在使用 Oracle 10.g。我有一个 table、LIB_BOOK,其中包含图书馆的图书清单。许多书都有多份副本。我想生成一份报告,其中列出了所有多于一本的书籍。我构建了一个列出书籍的查询,但我无法找到一种方法来只获取结果的一行。

Select 
    title
  , copy_number
  , isbn_10
  , category
  , book_pk
  , max(copy_number)
From LIB_BOOK
Group by 
    title
  , copy_number
  , isbn_10
  , category
  , book_pk
Order by copy_number desc
  ;

正如您在下面的数据结果中看到的,我得到 "Conversations with God - Book 1" 的结果列出了七次。我希望那本书只列出一次,并以“7”作为 copy_number。

我把查询结果的前32行,导出到Excel,贴下图

如何构建一个查询,使每本书只有一行,并避免只有一本的书 (copy_number > 1)? 感谢您查看此内容。

您需要从 group by:

中删除 copy_number()book_pk
Select title, isbn_10, category,
       max(copy_number)
From LIB_BOOK
Group by title, isbn_10, category
Order by max(copy_number) desc;

我不确定 book_pk 你想要什么,所以我刚把它从 select 中删除了。

试试这个

  Select 
    title
  , copy_number
  , isbn_10
  , category
  , book_pk
  , copy_number
From LIB_BOOK lib
join (select title,max(copy_number) as maxcopynumber
from LIB_BOOK group by title) maxcopy on lib.title = maxcopy.title and lib.copy_number = maxcopy.maxcopynumber

Order by lib.copy_number desc
  ;

看起来你只想列出重复的书,不管是什么类别,拷贝数等。所以按书分组(isbn 和书名)并计数,然后在你的 HAVING 子句中删除少于 2 本的书:

select 
    title
  , isbn_10
  , max(copy_number) as max_copy_number
  , count(*) as number_of_copies
from lib_book
group by title, isbn_10
having count(*) > 1
order by count(*) desc;

您可以使用不受支持的 WM_CONCAT 来列出类别和预订 pks:

select 
    title
  , isbn_10
  , max(copy_number) as max_copy_number
  , count(*) as number_of_copies
  , wm_concat(distinct category) as categories
  , wm_concat(book_pk) as book_pks
...

请注意,您得到了多行,因为您分组所依据的某些字段对于同一本书是不同的,例如拷贝数和书包...

请尝试以下查询:

SELECT * 来自(SELECT 标题, COPY_NUMBER, ISBN_10, 类别, BOOK_PK, COPY_NUMBER, ROW_NUMBER() OVER(按 ISBN 分区,按 COPY_NUMBER 描述排序)RN 来自 LIB_BOOK) X 其中 RN = 1