如何通过子查询计算两个不同日期的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
相关产品推荐
相关产品推荐

