Объединение двух приведенных столбцов по порядку, когда один равен нулю - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть таблица инвентаризации, где у меня есть записи, которые касаются движения запасов продуктов, проданных компанией. Движение имеет параметры «ВХОДЯЩИЙ», «ВЫХОДНОЙ», основанные на типе движения инвентаря. В нем также есть еще один столбец, в котором указывается тип «ВХОДЯЩИЙ» или «ВЫХОДНОЙ» ... например, входящий из-за прихода НОВОГО СТОКА, исходящий из-за ПОКУПКИ клиентом ... и т.д ...

Сейчас я делаю отчет, в котором хочу долгое время перечислять не проданные продукты. Поэтому я делаю следующий запрос ...

SELECT p.id as pid, product_name, DATEDIFF(NOW(), MAX(case when movement_type='OUTGOING' and movement_type_category='PURCHASED' then movement_on end)) AS unsold_days_since_last_sale, DATEDIFF(NOW(), MIN(case when movement_type='INCOMING' and movement_type_category='NEW_STOCK' and quantity>0 then movement_on end)) AS unsold_days_since_first_inventory_in, MAX(case when movement_type='INCOMING' and movement_type_category='NEW_STOCK' and quantity>0 then movement_on end) AS last_inv_in from inventory_movement im left join products p on im.product = p.id GROUP BY product having last_inv_in > 0 ORDER BY unsold_days_since_last_sale desc limit 100 

И я получаю следующий вывод, как показано на рисунке. enter image description here Этот вывод почти правильный, но с одной проблемой. Если продукт никогда не продавался ни разу в прошлом, столбец, в котором я пытаюсь получить дни, отличные от CURRENT DAY и LAST SOLD DAY, вернет ноль. В этом случае мне нужно, чтобы разница ДНЕЙ между ТЕКУЩИМ ДНЕМ и ПЕРВЫМ ИНВЕНТАРЬОМ этого продукта была на месте, чтобы я мог заказать этот столбец по убыванию и получить вывод. Но я могу получить эти данные только как 2 разных столбца, а не как один столбец. Может кто-нибудь помочь мне написать запрос, чтобы получить его в виде объединенного столбца, чтобы я мог отсортировать эти данные, чтобы получить результат. Прикрепляю также свою таблицу движения инвентаря, чтобы показать, как выглядят данные ...

enter image description here

1 Ответ

0 голосов
/ 14 ноября 2018

Я думаю, что функция IfNull решит вашу проблему.

Вот модифицированный запрос.

 SELECT p.id                                        AS pid, 
   product_name, 
   Datediff(Now(), Ifnull(Max(CASE 
                                WHEN movement_type = 'OUTGOING' 
                                     AND movement_type_category = 
                                         'PURCHASED' THEN 
                                movement_on 
                              end), Min(CASE 
                                          WHEN movement_type = 'INCOMING' 
                                               AND movement_type_category = 
                                                   'NEW_STOCK' 
                                               AND quantity > 0 THEN 
                                          movement_on 
                                        end))) AS 
   unsold_days_since_last_sale, 
   Datediff(Now(), Min(CASE 
                         WHEN movement_type = 'INCOMING' 
                              AND movement_type_category = 'NEW_STOCK' 
                              AND quantity > 0 THEN movement_on 
                       end))                   AS 
   unsold_days_since_first_inventory_in, 
   Max(CASE 
         WHEN movement_type = 'INCOMING' 
              AND movement_type_category = 'NEW_STOCK' 
              AND quantity > 0 THEN movement_on 
       end)                                    AS last_inv_in 
FROM   inventory_movement im 
   LEFT JOIN products p 
          ON im.product = p.id 
GROUP  BY product 
HAVING last_inv_in > 0 
ORDER  BY unsold_days_since_last_sale DESC 
LIMIT  100 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...