以与基本查询分组相同的方式对子查询进行分组 SQL

Grouping my subquery the same way I group my base query SQL

我在使用子查询 return 获取正确值时遇到困难。从下面的查询和结果中可以看出,我正在尝试对 return 列使用子查询,该列对 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;

查看第 3 列 'margin_2020' 每行 return 的值相同,而不是按频道过滤。正如它在 margin_2019 列中所做的那样。我如何将相同的分组逻辑应用于子查询,以便 margin_2020 按渠道细分?

感谢您的帮助或建议。

您只需要使用 ga_mapping 关联它,如下所示:

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;