MySQL Query для получения суммы продаж продуктов в неделю с использованием объединения для получения средних данных из другой таблицы - PullRequest
0 голосов
/ 01 декабря 2018
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)

Приведенный выше запрос приводит к неправильной сумме проданных единиц товара.

Кто-нибудь здесь, кто может мне помочь с запросом?Я буду очень благодарен.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Это ваш запрос:

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;
0 голосов
/ 01 декабря 2018

Проблема заключается в операторе case.

(case when (round(sum(sr.unit_sold)) in ('','N/A',NULL)) THEN 0 ELSE round(sum(sr.unit_sold)) END) as unit_sold.

Округление и сумма должны быть самыми внешними функциями.В выписке по регистру следует проверять отдельный столбец, не суммированный и округленный столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...