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

如何通过子查询计算两个不同日期的SQL聚合结果差值?

没问题,我来帮你梳理下怎么写这个SQL语句!你的需求是计算两个不同日期(2017-06-30和2017-03-31)的聚合结果差值,用子查询或者更简洁的条件聚合都能实现,我给你两种清晰的写法:

解决方法:计算两个日期聚合结果的差值

方法一:用JOIN关联两个子查询(逻辑更直观)

这种方式把两个日期的查询分别作为子查询,再通过共同的维度字段关联,新手更容易理解:

SELECT 
    t1.Prop_Code,
    t1.MBA_Account,
    t1.Q1 AS Q1_20170630,
    t2.Q1 AS Q1_20170331,
    (t1.Q1 - t2.Q1) AS Q1_Difference
FROM 
    -- 子查询1:获取2017-06-30的聚合数据
    (SELECT 
        Prop_Code, 
        MBA_Account, 
        SUM([12.31.2017_YTD]) AS Q1 
     FROM [2017DB] 
     WHERE Date = '2017-06-30' 
     GROUP BY Prop_Code, MBA_Account) AS t1
INNER JOIN 
    -- 子查询2:获取2017-03-31的聚合数据
    (SELECT 
        Prop_Code, 
        MBA_Account, 
        SUM([12.31.2017_YTD]) AS Q1 
     FROM [2017DB] 
     WHERE Date = '2017-03-31' 
     GROUP BY Prop_Code, MBA_Account) AS t2
ON 
    t1.Prop_Code = t2.Prop_Code 
    AND t1.MBA_Account = t2.MBA_Account;

如果某个维度在其中一个日期没有数据,想保留结果的话,可以把INNER JOIN换成LEFT JOIN或者RIGHT JOIN。

方法二:用条件聚合(更高效,仅扫描一次表)

如果你的数据库支持条件聚合(主流数据库都支持),可以不用嵌套子查询,直接在一个语句里完成计算:

SELECT 
    Prop_Code,
    MBA_Account,
    -- 计算2017-06-30的Q1总和
    SUM(CASE WHEN Date = '2017-06-30' THEN [12.31.2017_YTD] ELSE 0 END) AS Q1_20170630,
    -- 计算2017-03-31的Q1总和
    SUM(CASE WHEN Date = '2017-03-31' THEN [12.31.2017_YTD] ELSE 0 END) AS Q1_20170331,
    -- 直接计算差值
    SUM(CASE WHEN Date = '2017-06-30' THEN [12.31.2017_YTD] ELSE 0 END) 
    - SUM(CASE WHEN Date = '2017-03-31' THEN [12.31.2017_YTD] ELSE 0 END) AS Q1_Difference
FROM [2017DB]
WHERE Date IN ('2017-06-30', '2017-03-31')
GROUP BY Prop_Code, MBA_Account;

新手常踩的坑

你之前的写法报错,大概率是这两个原因:

  • 子查询没有取别名(SQL要求嵌套子查询必须有别名,比如上面的t1、t2)
  • 子查询之间没有正确关联维度字段,导致出现笛卡尔积或者关联失败

内容的提问来源于stack exchange,提问作者AdMac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:25:28