sql - 有没有办法显示每周丢失多少本书?
问题描述
我有一个图书馆管理系统的数据库。我必须显示每周有多少书被借、归还和丢失(有任何信息的周)。如果图书在 7 天内未归还,则视为逾期。如果这本书没有返回预期的一周,则认为该周丢失。结果应该是这样的
Week | Borrowed | Returned | Missing
-----+----------+----------+---------
4 | 10 | 8 | 2
5 | 5 | 4 | 3
我已经弄清楚了借用和归还的部分
select date_part('week', dateofborrowing) as week,
date_part('year', dateofborrowing) as year,
count(dateofborrowing) as borrowed,
null as returned,
null as missing
from borrowing
group by year,week
union
select date_part('week', returndate) as week,
date_part('year', returndate) as year,
null as borrowed,
count(returndate) as returned,
null as missing
from borrowing
group by year, week
order by year, week;
返回看起来像这样
week | year | borrowed | returned | missing
------+------+----------+----------+---------
45 | 2018 | 1 | |
46 | 2018 | | 1 |
51 | 2018 | 1 | |
52 | 2018 | | 1 |
5 | 2019 | 3 | |
6 | 2019 | 4 | |
7 | 2019 | 5 | |
7 | 2019 | | 9 |
8 | 2019 | | 3 |
14 | 2019 | 1 | |
17 | 2019 | | 1 |
36 | 2019 | 1 | |
37 | 2019 | 7 | |
38 | 2019 | 2 | |
| | | 0 |
如果有快速修复,最好第 7 周应该在同一行
但是,我正在努力解决的是缺少的列。感谢您的帮助!
这是表借用的创建
CREATE TABLE Borrowing (
BorrowingID int PRIMARY KEY,
ResourceID int REFERENCES Books(ResourceID),
UserID int REFERENCES Usser(UserID),
DateOfBorrowing date,
ReturnDate date,
Delay int ); // total amount of days a book is delayed
一些数据
INSERT INTO borrowing (borrowingid, resourceid, userid, dateofborrowing, returndate, delay)
VALUES (1, 117, 28, '2018-11-11', '2018-11-15', 0),
(2, 118, 30, '2018-12-22', '2018-12-29', 0),
(3, 119, 37, '2019-02-02', '2019-02-12', 3),
(4, 120, 37, '2019-02-02', '2019-02-14', 5),
(5, 121, 11, '2019-04-03', '2019-04-25', 15),
(6, 122, 32, '2019-02-03', '2019-02-11', 1),
(7, 123, 34, '2019-02-05', '2019-02-19', 7),
(8, 124, 39, '2019-02-08', '2019-02-14', 0),
(9, 125, 39, '2019-02-09', '2019-02-14', 0),
(10, 126, 39, '2019-02-10', '2019-02-14', 0),
(11, 127, 15, '2019-02-12', '2019-02-15', 0),
(12, 128, 16, '2019-02-12', '2019-02-16', 0),
(13, 129, 17, '2019-02-13', '2019-02-16', 0),
(14, 130, 18, '2019-02-14', '2019-02-20', 0),
(15, 131, 32, '2019-02-15', '2019-02-20', 0);
解决方案
您可能可以使用sum(CASE WHEN Delay >= 7 THEN 1 END) as missing
或类似的东西。
有关详细信息,请参阅文档。
推荐阅读
- websocket - 如何对 Spring WebSocketStompClient 进行单元测试
- javascript - 在 Javascript 端工作时的 RSA 或其他信息加密方法
- c# - Windows 窗体应用程序中基于属性的异常日志记录
- android - 菜单不显示在点击
- c# - C# WEBApi MVC 帮助页面
- javascript - 尝试将堆栈导航器注入组件并收到错误消息“您应该只渲染一个导航器”
- laravel - Laravel 在 Blade 中使用 S3/CloudFront 资源
- excel - 在 [VBA 宏] 中聚合具有两个主要 ID 的记录
- sql - 段、区和数据块的解释
- java - 如何在 Java 中定位广告牌精灵?