编写SQL查询,从给定数据库返回指定格式的客户订单聚合数据
需求说明
现有如下数据库表及数据:
CustomerType表
| CustomerTypeId | CustomerTypeDisplayName |
|---|---|
| 1 | 个人客户 |
| 2 | 企业客户 |
Customer表
| CustomerId | CustomerName | CustomerTypeId |
|---|---|---|
| 1 | John Smith | 1 |
| 2 | Peterson Ltd | 2 |
| 3 | Paul Taylor | 1 |
| 4 | Janet Peters | 1 |
Order表
| OrderId | CustomerId | OrderDate |
|---|---|---|
| 1 | 1 | 2010-01-01 |
| 2 | 4 | 2010-01-02 |
| 3 | 2 | 2010-01-02 |
| 4 | 2 | 2010-02-10 |
| 5 | 2 | 2010-03-05 |
| 6 | 1 | 2011-10-01 |
| 7 | 4 | 2011-11-01 |
| 8 | 2 | 2012-05-01 |
需要编写一条SQL查询语句,返回包含客户名称、客户类型显示名、订单数量、最早订单日期的结果集(示例为John Smith的记录,实际需返回所有符合条件的客户数据):
| CustomerName | CustomerTypeDisplayName | NumberOfOrders | EarliestOrderDate |
|---|---|---|---|
| John Smith | 个人客户 | 2 | 2010-01-01 |
解决方案
通过多表关联结合聚合函数即可实现需求,SQL语句如下:
SELECT c.CustomerName, ct.CustomerTypeDisplayName, COUNT(o.OrderId) AS NumberOfOrders, MIN(o.OrderDate) AS EarliestOrderDate FROM Customer c INNER JOIN CustomerType ct ON c.CustomerTypeId = ct.CustomerTypeId LEFT JOIN [Order] o ON c.CustomerId = o.CustomerId GROUP BY c.CustomerName, ct.CustomerTypeDisplayName HAVING COUNT(o.OrderId) > 0; -- 若要包含无订单的客户,可删除此条件
说明
- 用
INNER JOIN关联Customer和CustomerType表,获取客户的类型信息; - 用
LEFT JOIN关联Order表,确保无订单的客户也能被查询到(若只需要有订单的客户,可改为INNER JOIN); - 通过
COUNT(o.OrderId)统计订单数量,MIN(o.OrderDate)提取最早订单日期; GROUP BY按客户名称和类型显示名分组,保证聚合结果对应到单个客户;HAVING子句过滤掉无订单的客户,不需要的话直接删除即可。
内容的提问来源于stack exchange,提问作者Sdot4allg
相关产品推荐
相关产品推荐

