You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨3年交易数据的Year-To-Date(YTD)年度绩效查询需求

按YTD基准汇总多年份交易绩效的SQL解决方案

嘿,这个需求我经常碰到,刚好可以给你一套实用的SQL写法,完美匹配你要的横向输出格式!

核心思路

我们需要搞定这几件关键事:

  1. 把原数据里的字符串日期、带逗号的金额转换成可计算的类型
  2. 对每个目标年份,筛选出该年份内日期不晚于当前日期对应月日的交易(比如今天是10月5日,2016年就统计1/1/2016到10/5/2016的交易)
  3. 用条件聚合把各年份的汇总金额转成横向列,直接输出你要的格式

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年直接用当前日期判断即可

输出效果

执行后会得到你想要的横向结果:

201620172018
250023003400

内容的提问来源于stack exchange,提问作者Kenince E'm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:52:29