SQL中GROUP BY分组后使用SUM()统计1996年订单总数方法
问题背景
我有一张名为sumTable的数据表,表结构及样例数据如下:
| year | Orders |
|---|---|
| 1996-07-04 00:00:00.000 | 2 |
| 1996-10-15 00:00:00.000 | 3 |
| 1997-10-08 00:00:00.000 | 1 |
| 1996-10-03 00:00:00.000 | 5 |
| 1994-11-05 00:00:00.000 | 1 |
| 1996-07-04 00:00:00.000 | 2 |
| 1999-10-15 00:00:00.000 | 3 |
| 1996-10-08 00:00:00.000 | 1 |
| 1995-10-03 00:00:00.000 | 5 |
| 1996-11-05 00:00:00.000 | 1 |
需求为统计1996年的订单总数量,结果以单列形式展示,预期输出如下:
Expected Output Total Orders 14
原有尝试的SQL语句如下,执行后无法得到正确结果:
select datepart(yy, '1996'), sum(orders) AS 'Total_Orders' from SumTable group by orders
原有语句错误点
- 日期取值错误:
datepart(yy, '1996')是对固定字符串'1996'做年份提取,没有读取表中存储日期的year字段,无法识别哪些记录属于1996年 - 分组逻辑错误:
group by orders会按订单数的值拆分分组,无法对全年所有符合条件的记录做全局汇总 - 缺少过滤条件:没有限定只统计1996年的记录,会混入其他年份的订单数据
- 列名不匹配:别名设置为
Total_Orders,和预期要求的Total Orders不一致
正确SQL写法
根据使用的数据库类型选择对应语句即可:
SQL Server 版本(匹配原语句用的DATEPART语法)
SELECT SUM(orders) AS [Total Orders] FROM sumTable WHERE DATEPART(yy, year) = 1996;
MySQL 版本
SELECT SUM(orders) AS `Total Orders` FROM sumTable WHERE YEAR(year) = 1996;
语句逻辑说明:
- 直接通过
WHERE条件筛选出year字段日期值属于1996年的所有记录 - 因为是对所有符合条件的记录做全局汇总,不需要加
GROUP BY分组,直接用SUM()聚合函数计算订单总数即可 - 计算1996年对应订单值总和:2+3+5+2+1+1=14,完全匹配预期输出结果
内容的提问来源于stack exchange,提问作者Affy
相关产品推荐
相关产品推荐

