分组子查询的方式与分组基本查询SQL的方式相同
我的子查询很难返回正确的值。从下面的查询和结果中可以看出,我试图使用子查询返回一个列,该列对margin_2020列使用不同的日期范围分组子查询的方式与分组基本查询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
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;