Я думаю, что вы предполагаете, что вы присоединяетесь на основе проекции "product_id" (или "псевдоним", как вы ее называете) в части SELECT
. Но это не тот случай. В SQL JOIN
всегда происходит первым, поэтому часть JOIN
не «знает» о SELECT
-Части.
Чтобы решить вашу проблему, вам нужно
- используйте выражение
REPLACE
дважды в JOIN
- всегда с префиксом product_id перед таблицей
SELECT
date_part('year', table1.date_time) as "year",
date_part('month', table1.date_time) as "month",
date_part('week', table1.date_time) as "week",
date_part('day', table1.date_time) as "day",
REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') as "product_id",
count(table1.product_quote) as quotes,
table3.sales,
table4.category_name
from table1
left join table2 ON REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') = table2.product_id
left join table4 ON table2.category_id = table4.category_id
left join table3 ON REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') = table3.product_id AND
date_part('year', table3.date) = date_part('year', table1.date_time) AND
date_part('month', table3.date) = date_part('month', table1.date_time) AND
date_part('day', table3.date) = date_part('day', table1.date_time)
where date_part('year', table1.date_time) = '2020'
group by year, month, week, day, table2.product_id, table1.product_quote, table4.category_name, table3.sales
По крайней мере, выше базовый c раствор. Вы также можете использовать псевдонимы, если вы проецируете table1
до join
, используя подвыбор:
SELECT
t1.year,
t1.month,
t1.week,
t1.day,
t1.product_id,
t1.quotes,
table3.sales,
table4.category_name
FROM
(
SELECT
date_part('year', table1.date_time) as "year",
date_part('month', table1.date_time) as "month",
date_part('week', table1.date_time) as "week",
date_part('day', table1.date_time) as "day",
REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') as "product_id",
count(table1.product_quote) as quotes,
from table1
) as t1
left join table2 ON t1.product_id = table2.product_id
left join table4 ON table2.category_id = table4.category_id
left join table3 ON t1.product_id = table3.product_id AND
date_part('year', table3.date) = t1.year AND
date_part('month', table3.date) = t1.month AND
date_part('day', table3.date) = t1.day
where t1.year = '2020'
group by t1.year, t1.month, t1.week, t1.day, table2.product_id, t1.product_quote, table4.category_name, table3.sales