首页 > 试题广场 >

统计借阅量

[编程题]统计借阅量
  • 热度指数:10986 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

为优化馆藏管理与读者服务,图书馆每月需复盘各图书的借阅表现。请基于借阅记录与分馆信息,统计每本书在 2024 年 2 月与 2024 年 1 月的借阅量,并与 2023 年 2 月对比;同时给出 2023 年各分区(华北、华东、华南)的借阅占比,用于评估区域结构变化。数据来自图书表、借阅表与分馆表。

【原始表】
Books(图书)表

  • book_id INT 主键:图书唯一标识
  • book_title VARCHAR:图书标题
  • category VARCHAR:图书所属类别

BorrowRecords(借阅记录)表

  • record_id INT 主键:借阅流水标识
  • book_id INT 外键 → Books.book_id
  • branch_id INT 外键 → Branches.branch_id
  • borrow_date DATE:借阅日期
  • member_id INT:借阅者ID(本题不直接使用)

Branches(分馆)表

  • branch_id INT 主键
  • branch_name VARCHAR:分馆名称
  • region ENUM('华北','华东','华南'):分区

输出每本书的借阅概览,结果需包含如下字段,并按 book_id 升序排列(若并列再按 book_title 升序):

  • book_id:图书ID
  • book_title:图书名称
  • feb_2023_borrows:2023 年 2 月借阅量
  • feb_2024_borrows:2024 年 2 月借阅量
  • jan_2024_borrows:2024 年 1 月借阅量
  • yoy_delta:同比增量 = feb_2024_borrows - feb_2023_borrows
  • mom_delta:环比增量 = feb_2024_borrows - jan_2024_borrows
  • north_pct_2023:2023 年华北借阅占比(保留两位小数)
  • south_pct_2023:2023 年华南借阅占比(保留两位小数)
  • east_pct_2023:2023 年华东借阅占比(保留两位小数)

【示例输入】

Books

Branches

BorrowRecords

【示例输出】


示例1

输入

DROP TABLE IF EXISTS BorrowRecords;
DROP TABLE IF EXISTS Branches;
DROP TABLE IF EXISTS Books;

CREATE TABLE Books (
  book_id    INT PRIMARY KEY,
  book_title VARCHAR(100),
  category   VARCHAR(50)
);

CREATE TABLE Branches (
  branch_id   INT PRIMARY KEY,
  branch_name VARCHAR(50),
  region      ENUM('华北','华东','华南')
);

CREATE TABLE BorrowRecords (
  record_id   INT PRIMARY KEY,
  book_id     INT,
  branch_id   INT,
  borrow_date DATE,
  member_id   INT
);

INSERT INTO Books VALUES
(1,'Database Systems','IT'),
(2,'Linear Algebra','Math');

INSERT INTO Branches VALUES
(1,'北馆','华北'),
(2,'东馆','华东'),
(3,'南馆','华南');

INSERT INTO BorrowRecords VALUES
(101,1,1,'2023-02-10',11),
(102,1,2,'2024-02-12',12),
(103,1,3,'2024-01-20',13),
(104,2,1,'2023-02-15',21),
(105,2,2,'2023-07-01',22),
(106,2,3,'2024-02-03',23);

输出

book_id|book_title|feb_2023_borrows|feb_2024_borrows|jan_2024_borrows|yoy_delta|mom_delta|north_pct_2023|south_pct_2023|east_pct_2023
1|Database Systems|1|1|1|0|0|100.00|0.00|0.00
2|Linear Algebra|1|1|0|0|1|50.00|0.00|50.00

备注:

约束与说明:

  • 必须连接并使用三张表。
  • 必须使用高级查询(含:CTE/子查询、条件聚合、CASE/COALESCE,至少两类)。
  • 若某月份无借阅,按 0 计算;2023 年占比 = 2023 年对应分区借阅量 / 2023 年该书总借阅量 × 100,保留两位小数,若分母为 0 则各分区占比均为 0.00。
头像 则非
发表于 2025-09-19 14:48:33
select book_id, book_title, sum(if(borrow_date between '2023-02-01' and '2023-02-28' ,1,0)) as feb_2023_borrows, sum(if(borrow_date be 展开全文
头像 风流倜傥三金老师
发表于 2025-10-03 21:40:04
WITH -- 使用CTE分模块计算输出结果。(这道题的本质是连接表后,进行列转行的操作) zongbiao AS ( -- 将所有要用到的表连接,并输出所有要用的字段 SELECT dan.record_id 展开全文
头像 牛哥j
发表于 2025-09-29 21:12:00
select book_id ,book_title ,sum(case when date_format(borrow_date ,'%Y-%m') = '2023-02' then 1 else 0 end) feb_2023_borrows ,sum(case when date_form 展开全文
头像 激动的大猩猩呀呼呀呼
发表于 2025-09-26 17:16:02
WITH t1 AS ( SELECT b1.book_id, b1.book_title, b1.category, b2.branch_id, b2.borrow_date, b2.member_id, 展开全文
头像 最爱青草蛋糕
发表于 2025-10-22 10:22:07
with t as (select bk.book_id as book_id,book_title,record_id,borrow_date,bc.branch_id as branch_id,branch_name from Books bk left join BorrowRecords b 展开全文
头像 最爱青草蛋糕
发表于 2025-10-22 10:50:55
with t as (select book_id,book_title,branch_name, date_format(borrow_date,'%Y-%m') as month, year(borrow_date) as year from Books bk left join BorrowR 展开全文
头像 桑榆未晚jiang
发表于 2025-11-27 19:44:54
with a as ( select record_id,book_id,branch_id,date_format(borrow_date,'%Y%m') d_f,year(borrow_date) d_y from BorrowRecords) select Books 展开全文
头像 牛客131452277号
发表于 2025-12-02 22:12:51
select b1.book_id,book_title, ifnull(sum(if(borrow_date like '2023-02%',1,0)),0) as feb_2023_borrows, ifnull(sum(if(borrow_date like '202 展开全文
头像 壹壹风荷举
发表于 2025-11-11 01:03:06
with region_temp as ( select bk.book_id,book_title,coalesce(round(sum(case when region='华北' then 1 else 0 end )/count(record_id)*100,2),0) as nor 展开全文
头像 Tendernessnick
发表于 2025-12-01 15:39:32
# 各个图书在特定时间的借阅量,和指定时间对比,同时给出各分区占比 with t1 as( select book_id, book_title, count(if(date_format(borrow_date,'%Y%m')='202302 展开全文