SQL Server数据汇总:按客户分组统计年度收入及购买状态
按客户分组统计年度收入及购买情况的SQL实现
原数据表结构及数据
| CustomerID | Income | Date | Product |
|---|---|---|---|
| 1 | 300 | 01/01/2015 | A |
| 1 | 300 | 01/01/2016 | B |
| 2 | 500 | 01/01/2016 | A |
| 2 | 300 | 01/01/2015 | B |
需求说明
按唯一CustomerID分组,输出以下信息:
- 2015年总收入
- 2016年总收入
- 是否购买过产品A(Yes/No)
- 两年总收入之和是否超过1000(Yes/No)
原代码问题分析
你写的代码存在三个核心问题:
- 分组字段包含
productID和YEAR(DateofPurchase),导致每个客户生成多条记录,不符合“唯一CustomerID”的要求 CASE和SUM的顺序错误,应该先筛选对应年份的收入再求和,而非先求和再判断- 字段名错误:原表日期字段是
Date而非DateofPurchase,产品字段是Product而非ProductID
正确SQL代码
SELECT CustomerID, SUM(CASE WHEN YEAR(Date) = 2015 THEN Income ELSE 0 END) AS `Total income 2015`, SUM(CASE WHEN YEAR(Date) = 2016 THEN Income ELSE 0 END) AS `Total income 2016`, CASE WHEN MAX(CASE WHEN Product = 'A' THEN 1 ELSE 0 END) = 1 THEN 'Yes' ELSE 'No' END AS `If bought prod. A`, CASE WHEN SUM(Income) > 1000 THEN 'Yes' ELSE 'No' END AS `if total income (2015+2016) is above 1K` FROM exam GROUP BY CustomerID;
代码说明
- 年度收入统计:用
SUM包裹CASE语句,先筛选对应年份的收入再求和,确保每个客户只返回一条汇总记录 - 是否购买过产品A:通过嵌套
CASE和MAX,只要客户有过一次购买A的记录,就返回Yes - 总收入判断:直接对客户的所有收入求和,再判断是否超过1000
内容的提问来源于stack exchange,提问作者Yuval
相关产品推荐
相关产品推荐

