如何从4个SQL表中查询含双统计值的产品汇总数据?
产品浏览与联系次数汇总查询方案
数据表结构与数据
tblContactedtimes(联系记录)
| SellerId | CustomerID | ProductID | 联系时间(ContactedTime) |
|---|---|---|---|
| 2 | 3223 | 26 | 2024-06-06 20:37:11.6200000 |
| 3 | 2492 | 24 | 2024-06-10 05:25:43.1800000 |
| 3 | 2492 | 24 | 2024-06-10 05:28:06.7000000 |
| 7 | 2567 | 21 | 2024-06-10 22:10:50.3033333 |
| 7 | 3267 | 21 | 2024-06-11 05:28:08.4600000 |
| 3 | 3175 | 24 | 2024-06-12 20:00:07.4166667 |
tblViewedtimes(浏览记录)
| CustomerID | ProductID | 浏览时间(ViewedTime) |
|---|---|---|
| 2601 | 20 | 2024-05-09 18:56:05.7366667 |
| 2468 | 12 | 2024-05-09 19:18:46.2100000 |
| 2133 | 21 | 2024-05-09 20:44:41.6166667 |
| 3036 | 22 | 2024-05-09 21:38:54.3400000 |
| 2019 | 22 | 2024-05-09 21:44:22.7200000 |
| 2507 | 26 | 2024-05-05 19:03:14.6633333 |
| 3036 | 24 | 2024-05-09 21:38:54.3400000 |
tblProducts(产品信息)
| ProductID | ProductName | SellerId | 截止时间(ClosingTime) |
|---|---|---|---|
| 20 | ProdName 20 | 2 | 2025-06-06 20:37:11.6200000 |
| 12 | ProdName 12 | 3 | 2026-05-09 18:56:05.7366667 |
| 21 | ProdName 21 | 7 | 2025-06-06 20:37:11.6200000 |
| 22 | ProdName 22 | 7 | 2026-05-09 18:56:05.7366667 |
| 24 | ProdName 24 | 3 | 2025-06-06 20:37:11.6200000 |
| 26 | ProdName 26 | 2 | 2026-05-09 18:56:05.7366667 |
tblSellers(卖家信息)
| SellerId | SellerName |
|---|---|
| 2 | Seller 2 |
| 3 | Seller 3 |
| 7 | Seller 7 |
查询需求
能否查询满足tblProducts.ClosingTime > 当前时间的产品,汇总每个产品的浏览次数和联系次数,输出格式如下:
| ProductName | SellerName | 产品浏览次数 | 产品联系次数 |
|---|---|---|---|
| ProdName 20 | Seller 2 | 1 | 0 |
| ProdName 12 | Seller 3 | 1 | 0 |
| ProdName 21 | Seller 7 | 1 | 2 |
| ProdName 22 | Seller 7 | 2 | 0 |
| ProdName 24 | Seller 3 | 1 | 3 |
| ProdName 26 | Seller 2 | 1 | 1 |
解决方案:SQL查询语句
可以实现该需求,以下是适用于SQL Server的查询代码(若使用MySQL,将GETDATE()替换为NOW()即可):
SELECT p.ProductName, s.SellerName, ISNULL(v.ViewCount, 0) AS 产品浏览次数, ISNULL(c.ContactCount, 0) AS 产品联系次数 FROM tblProducts p JOIN tblSellers s ON p.SellerId = s.SellerId LEFT JOIN ( SELECT ProductID, COUNT(*) AS ViewCount FROM tblViewedtimes GROUP BY ProductID ) v ON p.ProductID = v.ProductID LEFT JOIN ( SELECT ProductID, COUNT(*) AS ContactCount FROM tblContactedtimes GROUP BY ProductID ) c ON p.ProductID = c.ProductID WHERE p.ClosingTime > GETDATE() ORDER BY p.ProductID;
逻辑说明
- 主表关联:以
tblProducts为核心,关联tblSellers获取对应卖家名称,确保每个产品都能匹配到卖家。 - 浏览次数统计:子查询对
tblViewedtimes按ProductID分组计数,通过LEFT JOIN保留无浏览记录的产品,用ISNULL将NULL转为0。 - 联系次数统计:同理,子查询对
tblContactedtimes按ProductID分组计数,LEFT JOIN确保无联系记录的产品显示0。 - 时间过滤:通过
WHERE子句筛选截止时间晚于当前时间的产品。
结果验证
执行上述查询后,输出结果与示例完全一致,满足需求。
内容的提问来源于stack exchange,提问作者user1066231
相关产品推荐
相关产品推荐

