1

我有一个这样的数据库(标准化,简化以描述问题):

BOOKS:
ID (PK) | TITLE | AUTHOR | ...
--------|-------|--------|-----
 0 | Title_1 | Author_1 
 1 | Title_2 | Author_1
 2 | Title_3 | Author_2
 3 | Title_3 | Author_3

ORDERs:
ID | BOOK_ID | USER_ID | ORDER_DATE | ...
---|---------|---------|------------|----
 0 | 1 | 1 | 2020-04-10 |
 1 | 2 | 2 | 2020-04-15 |
 2 | 2 | 1 | 2020-04-26 |
 3 | 2 | 1 | 2020-05-02 | 

我想要实现的是这样的

RESULT:
BOOK | Num_All_Time_Orders | Num_Orders_April | Num_Orders_May

根据要求:https ://www.db-fiddle.com/f/e1gW7aVEh3Gh547nZHvaDA/0

基本上计算每本书的所有订单。All Time 部分非常简单,但我正在尝试获取“所有”时间跨度的视图。

这可能(以简单的方式)还是我应该使用不同的参数进行后续查询?

NumAllTime 的当前查询如下所示:

SELECT BOOK.ID , COUNT(ORDERS.BOOK_ID)
FROM BOOKS AS BOOK
LEFT JOIN ORDERS ON BOOK.ID = ORDERS.BOOK_ID
GROUP BY BOOK.ID

编辑:感谢您的即时评论。编辑了一些东西。

4

1 回答 1

2

您可以通过仅计算与现在或一个月前具有相同月份的值来确定当前月份和上个月的订单:

SELECT b.ID,
       COUNT(o.ID) AS All_Orders,
       COUNT(CASE WHEN EXTRACT(YEAR_MONTH FROM o.ORDER_DATE) = EXTRACT(YEAR_MONTH FROM CURDATE()) THEN 1 END) AS This_Month_Orders,
       COUNT(CASE WHEN EXTRACT(YEAR_MONTH FROM o.ORDER_DATE) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH) THEN 1 END) AS Last_Month_Orders
FROM BOOKS b
JOIN ORDERS o ON o.BOOK_ID = b.ID
GROUP BY b.ID

输出:

ID  All_Orders  This_Month_Orders   Last_Month_Orders
1   1           0                   1
2   3           1                   2

dbfiddle 上的演示

于 2020-05-08T07:45:53.617 回答