Tengo dificultades para que mi subconsulta devuelva los valores adecuados. Como puede ver en la consulta y los resultados a continuación, estoy tratando de usar una subconsulta para devolver una columna que usa un rango de fechas diferente para la columna 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;

enter image description here

Mirando la tercera columna 'margin_2020', cada fila devuelve el mismo valor en lugar de filtrar por canal. Como está haciendo en la columna margin_2019. ¿Cómo aplico la misma lógica de agrupación a la subconsulta para que margin_2020 se desglose por canal?

Gracias por cualquier ayuda o consejo.

0
Mitchell.Laferla 20 ene. 2021 a las 09:12

1 respuesta

La mejor respuesta

Solo necesita correlacionarlo usando ga_mapping de la siguiente manera:

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;

También puede evitar la subconsulta utilizando la agregación condicional de la siguiente manera:

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;
1
Popeye 20 ene. 2021 a las 06:17