如何按月份/年份展示去重Name列及其累计Count值?
按姓名和年月聚合统计累计值的SQL查询方法
核心逻辑是按姓名分组,同时按年月维度聚合,对Count (*)列求和,并将日期格式化为MonYYYY样式。以下是主流数据库的实现方案:
原始数据(示例表假设名为your_table)
Name "Count (*)" Date Blue 2 01-NOV-22 Blue 1 03-NOV-22 Blue 3 11-NOV-22 Green 5 01-NOV-22 Green 5 11-NOV-22
1. Oracle 数据库
用TO_CHAR格式化日期,按姓名和格式化后的年月分组,对"Count (*)"列求和:
SELECT Name, SUM("Count (*)") AS count, TO_CHAR(Date, 'MONYYYY') AS Date FROM your_table -- 如需指定年月,添加筛选条件,例如2022年11月: -- WHERE Date BETWEEN TO_DATE('01-NOV-22', 'DD-MON-RR') AND TO_DATE('30-NOV-22', 'DD-MON-RR') GROUP BY Name, TO_CHAR(Date, 'MONYYYY') ORDER BY Name;
2. MySQL 数据库
使用DATE_FORMAT处理日期格式,分组逻辑一致:
SELECT Name, SUM(`Count (*)`) AS count, DATE_FORMAT(Date, '%b%Y') AS Date FROM your_table -- 指定年月的筛选条件,例如2022年11月: -- WHERE YEAR(Date) = 2022 AND MONTH(Date) = 11 GROUP BY Name, DATE_FORMAT(Date, '%b%Y') ORDER BY Name;
注意:如果日期列存储为字符串,需先转换为日期类型,例如
STR_TO_DATE(Date, '%d-%b-%y'),再进行格式化和筛选。
3. SQL Server 数据库
用FORMAT或DATENAME组合生成目标日期格式:
SELECT Name, SUM([Count (*)]) AS count, FORMAT(Date, 'MMMyyyy') AS Date FROM your_table -- 指定年月的筛选条件,例如2022年11月: -- WHERE YEAR(Date) = 2022 AND MONTH(Date) = 11 GROUP BY Name, FORMAT(Date, 'MMMyyyy') ORDER BY Name;
兼容性更好的DATENAME写法:
SELECT Name, SUM([Count (*)]) AS count, CONCAT(DATENAME(MONTH, Date), YEAR(Date)) AS Date FROM your_table WHERE YEAR(Date) = 2022 AND MONTH(Date) = 11 GROUP BY Name, DATENAME(MONTH, Date), YEAR(Date) ORDER BY Name;
执行结果
以上查询均可得到期望输出:
Name count Date Blue 6 Nov2022 Green 10 Nov2022
内容的提问来源于stack exchange,提问作者daisy.xa
相关产品推荐
相关产品推荐

