我正在查询 MySQL 8.0.28 数据库中的发票表,该数据库是客户表 (FK = CustomerId) 的子表,并且我希望能够根据过去 30 天内的不同条件获取多个计数,其中我进行分组客户和发票来源。所以如果我把它写成两个单独的查询,它会是这样的:
/* this is just the count of all invoices in last 30 days */
SELECT i.CustomerId, i.InvoiceSource, COUNT(*) AS TotalInvoices
FROM Invoice i
WHERE i.CreatedDate BETWEEN (CURDATE() - INTERVAL 1 MONTH ) and CURDATE()
GROUP BY i.CustomerId, i.InvoiceSource;
和
/* count of all invoices in last 30 days where the total amount exceeds 1000 */
SELECT i.CustomerId, i.InvoiceSource, COUNT(*) AS LargeInvoices
FROM Invoice i
WHERE i.CreatedDate BETWEEN (CURDATE() - INTERVAL 1 MONTH) and CURDATE() AND i.Amount > 1000
GROUP BY i.CustomerId, i.InvoiceSource;
您明白了,可能还会有 2 到 3 个具有特定标准的项目。
所以我的问题是:
- 首先也是最重要的是将其编写为单个查询的最佳方法和 SQL 是什么?
- 当我为不同条件添加更多计数时,它会开始使查询陷入困境吗?如果是这样,其上/下是什么?
- GROUP BY 对所有人来说都是相同的,我是否可以将其从每个子查询中移出,并将其作为整个事物的分组依据?不确定这是否会更有效?
多谢