分组子查询的方式与分组基本查询SQL的方式相同

分组子查询的方式与分组基本查询SQL的方式相同,sql,subquery,Sql,Subquery,我的子查询很难返回正确的值。从下面的查询和结果中可以看出,我试图使用子查询返回一个列,该列对margin_2020列使用不同的日期范围 SELECT os.ga_mapping as channel , SUM(os.margin) as margin_2019 , (select sum(os.margin) from orders_summary os where os.date_order between '2020-10-01' and '2020-12-31' gro

我的子查询很难返回正确的值。从下面的查询和结果中可以看出,我试图使用子查询返回一个列,该列对margin_2020列使用不同的日期范围

SELECT os.ga_mapping as channel
, SUM(os.margin) as margin_2019
, (select sum(os.margin)
   from orders_summary os
   where os.date_order between '2020-10-01' and '2020-12-31'
   group by 2) as margin_2020
, ((margin_2020 - margin_2019) / margin_2019) * 100 as rate_of_change

FROM orders_summary os
WHERE os.date_order BETWEEN '2019-07-01' AND '2019-09-31'
GROUP BY 1;

查看第三列“margin_2020”,每行返回相同的值,而不是按通道过滤。就像它在利润专栏中所做的那样。如何将相同的分组逻辑应用于子查询,以便按通道划分余量


感谢您的帮助或建议。

您只需使用
ga_映射对其进行核心化,如下所示:

SELECT os.ga_mapping as channel
, SUM(os.margin) as margin_2019
, (select sum(oss.margin)
   from orders_summary oss
   where oss.date_order between '2020-10-01' and '2020-12-31'
     and oss.ga_mapping = os.ga_mapping) as margin_2020 -- extra condition
, ((margin_2020 - margin_2019) / margin_2019) * 100 as rate_of_change
FROM orders_summary os
WHERE os.date_order BETWEEN '2019-07-01' AND '2019-09-31'
GROUP BY 1;
SELECT os.ga_mapping as channel
, SUM(case when os.date_order BETWEEN '2019-07-01' AND '2019-09-31' then os.margin end) as margin_2019
, SUM(case when os.date_order BETWEEN '2020-10-01' and '2020-12-31' then os.margin end) as margin_2020
, ((margin_2020 - margin_2019) / margin_2019) * 100 as rate_of_change
FROM orders_summary os
WHERE os.date_order BETWEEN '2019-07-01' AND '2019-09-31'
   or os.date_order between '2020-10-01' and '2020-12-31'
GROUP BY 1;
还可以使用条件聚合避免子查询,如下所示:

SELECT os.ga_mapping as channel
, SUM(os.margin) as margin_2019
, (select sum(oss.margin)
   from orders_summary oss
   where oss.date_order between '2020-10-01' and '2020-12-31'
     and oss.ga_mapping = os.ga_mapping) as margin_2020 -- extra condition
, ((margin_2020 - margin_2019) / margin_2019) * 100 as rate_of_change
FROM orders_summary os
WHERE os.date_order BETWEEN '2019-07-01' AND '2019-09-31'
GROUP BY 1;
SELECT os.ga_mapping as channel
, SUM(case when os.date_order BETWEEN '2019-07-01' AND '2019-09-31' then os.margin end) as margin_2019
, SUM(case when os.date_order BETWEEN '2020-10-01' and '2020-12-31' then os.margin end) as margin_2020
, ((margin_2020 - margin_2019) / margin_2019) * 100 as rate_of_change
FROM orders_summary os
WHERE os.date_order BETWEEN '2019-07-01' AND '2019-09-31'
   or os.date_order between '2020-10-01' and '2020-12-31'
GROUP BY 1;