跨3年交易数据的Year-To-Date(YTD)年度绩效查询需求
按YTD基准汇总多年份交易绩效的SQL解决方案
嘿,这个需求我经常碰到,刚好可以给你一套实用的SQL写法,完美匹配你要的横向输出格式!
核心思路
我们需要搞定这几件关键事:
- 把原数据里的字符串日期、带逗号的金额转换成可计算的类型
- 对每个目标年份,筛选出该年份内日期不晚于当前日期对应月日的交易(比如今天是10月5日,2016年就统计1/1/2016到10/5/2016的交易)
- 用条件聚合把各年份的汇总金额转成横向列,直接输出你要的格式
MySQL版本查询语句
假设你的表名为transactions,替换成你的实际表名即可:
SELECT -- 2016年YTD汇总 SUM(CASE WHEN YEAR(STR_TO_DATE(DATE, '%m/%d/%Y')) = 2016 AND STR_TO_DATE(DATE, '%m/%d/%Y') <= STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE()), '-', DAY(CURDATE())), '%Y-%m-%d') THEN CAST(REPLACE(AMOUNT, ',', '') AS DECIMAL(10,2)) ELSE 0 END) AS `2016`, -- 2017年YTD汇总 SUM(CASE WHEN YEAR(STR_TO_DATE(DATE, '%m/%d/%Y')) = 2017 AND STR_TO_DATE(DATE, '%m/%d/%Y') <= STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE()), '-', DAY(CURDATE())), '%Y-%m-%d') THEN CAST(REPLACE(AMOUNT, ',', '') AS DECIMAL(10,2)) ELSE 0 END) AS `2017`, -- 2018年YTD汇总(直接用当前日期判断) SUM(CASE WHEN YEAR(STR_TO_DATE(DATE, '%m/%d/%Y')) = 2018 AND STR_TO_DATE(DATE, '%m/%d/%Y') <= CURDATE() THEN CAST(REPLACE(AMOUNT, ',', '') AS DECIMAL(10,2)) ELSE 0 END) AS `2018` FROM transactions;
SQL Server版本查询语句
如果用的是SQL Server,语法略有调整,用CONVERT和DATEFROMPARTS处理日期:
SELECT SUM(CASE WHEN YEAR(CONVERT(DATE, DATE, 101)) = 2016 AND CONVERT(DATE, DATE, 101) <= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE())) THEN CAST(REPLACE(AMOUNT, ',', '') AS DECIMAL(10,2)) ELSE 0 END) AS [2016], SUM(CASE WHEN YEAR(CONVERT(DATE, DATE, 101)) = 2017 AND CONVERT(DATE, DATE, 101) <= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE())) THEN CAST(REPLACE(AMOUNT, ',', '') AS DECIMAL(10,2)) ELSE 0 END) AS [2017], SUM(CASE WHEN YEAR(CONVERT(DATE, DATE, 101)) = 2018 AND CONVERT(DATE, DATE, 101) <= GETDATE() THEN CAST(REPLACE(AMOUNT, ',', '') AS DECIMAL(10,2)) ELSE 0 END) AS [2018] FROM transactions;
关键细节说明
STR_TO_DATE/CONVERT:把原数据中MM/DD/YYYY格式的字符串日期转成数据库可识别的日期类型,方便年份提取和范围判断REPLACE(AMOUNT, ',', ''):去掉金额里的千位分隔符,再转成DECIMAL类型,确保SUM计算不会出错- 年份筛选逻辑:对于历史年份(2016、2017),我们把当前日期的月日拼到对应年份上(比如当前是2024-10-05,就生成2016-10-05),确保统计的是和当前年度同步的YTD范围;2018年直接用当前日期判断即可
输出效果
执行后会得到你想要的横向结果:
| 2016 | 2017 | 2018 |
|---|---|---|
| 2500 | 2300 | 3400 |
内容的提问来源于stack exchange,提问作者Kenince E'm
相关产品推荐
相关产品推荐

