使用 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
我正在使用 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