Это ваш запрос:
select week(cd.date_time, 4) as week,
year(cd.date_time) as year,
p.product_name as product_name,
p.asin as asin,
round(avg(cd.bsr_lv1)) as bsr_lv1,
round(avg(cd.bsr_lv2)) as bsr_lv2,
cd.stock_status as stock_status,
coalesce(nullif(round(avg(cd.price)), ''),
nullif(round(avg(cd.sale_price)), '' ),
nullif(round(avg(cd.deal_price)), ''),
'OOS'
) as price,
round(avg(cd.review_total)) as reviews,
round(avg(cd.rating), 1) as rating,
(case when (round(sum(sr.unit_sold)) in ('', 'N/A', NULL)) then 0 else round(sum(sr.unit_sold)) end) as unit_sold
from crawl_data cd left join
products p
on p.id = cd.product_id left join
sale_report sr
on sr.product_id = cd.product_id
where date(cd.date_time) BETWEEN CURRENT_DATE - INTERVAL '6' WEEK AND CURRENT_DATE and
p.asin = 'B07H66KQ1B' and
week(cd.date_time, 4) = week(sr.date_time, 4)
group by week(cd.date_time, 4), year(cd.date_time);
У него есть несколько проблем:
-
left join
для продуктов не требуется.Он превращается во внутреннее объединение с помощью предложения WHERE
. - Несколько столбцов в
select
, которых нет в group by
.,,такие как product_name
, asin
и stock_status
. - Вычисление
price
просто не имеет смысла, поскольку оно объединяет числа и строки. - Вычисление
units_sold
не имеет смысла, потому что он сравнивает выходные данные числовой функции со строками. IN (. . . NULL)
бесполезен.Он никогда не вернется true
.
Учитывая все эти проблемы и никаких реальных объяснений, я могу только предполагать, какой полезный запрос будет.Вот мое лучшее предположение:
select week(cd.date_time, 4) as week,
year(cd.date_time) as year,
p.product_name as product_name,
p.asin as asin,
round(avg(cd.bsr_lv1)) as bsr_lv1,
round(avg(cd.bsr_lv2)) as bsr_lv2,
cd.stock_status as stock_status,
coalesce(nullif(round(avg(cd.price)), 0),
nullif(round(avg(cd.sale_price)), 0),
nullif(round(avg(cd.deal_price)),
) as price, -- just return `NULL` if there is no price
round(avg(cd.review_total)) as reviews,
round(avg(cd.rating), 1) as rating,
round(sum(case when sr.unit_sold in ('', 'N/A') then 0 else 0 + sr.unit_sold end), 1) as unit_sold -- is units_sold really a string???
from crawl_data cd join
products p
on p.id = cd.product_id left join -- this could probably be an inner join as well
sale_report sr
on sr.product_id = cd.product_id
where date(cd.date_time) BETWEEN CURRENT_DATE - INTERVAL '6' WEEK AND CURRENT_DATE and
p.asin = 'B07H66KQ1B' and
week(cd.date_time, 4) = week(sr.date_time, 4)
group by week(cd.date_time, 4), year(cd.date_time),
p.product_name, p.asin, cd.stock_status;