MySQL объединяет 2 отдельных запроса в 1

0

Мне нужно подготовить отчет, в котором я отслеживаю входящие и исходящие поставки из местоположения, в результате чего получается количество каждого из SKU и вышло.

"Входящий" SKU имеет свой dest_loc, установленный в "LOC1", в то время как "исходящий" имеет значение source_loc, установленное в "LOC1", причем LOC1 является адресом ссылки.

Существует специальное значение назначения, называемое REC, что означает Recycled.

Каждый SKU имеет значения source_loc и dest_loc (нет нулевых случаев). Этот пример имеет три SKU и 5 возможных мест.

sku source_loc  dest_loc
sku1    LOC2    LOC1
sku1    LOC1    LOC1   <-- src=dest is a valid case
sku2    LOC3    LOC1
sku3    LOC4    LOC1
sku3    LOC4    LOC1
sku3    LOC1    LOC4
sku3    LOC1    LOC3
sku1    LOC1    LOC2
sku2    LOC3    LOC1
sku2    LOC1    REC

Окончательный отчет будет выглядеть следующим образом:

sku     inbound     outbound    recycle
sku1    2           1           0
sku2    2           0           1
sku3    2           2           0

Я могу получить одну половину данных, используя это:

SELECT sku, count(*)
    FROM skudata
    WHERE 'dest_loc' = "LOC1"
    GROUP BY 'sku', 'source_loc'
    ORDER BY 'sku';

Мне нужно также добавить в WHERE source_loc = "LOC1". Я мог бы запускать два запроса отдельно, но потом мне пришлось бы сшивать результаты вместе, что было бы болью. Как мне лучше написать запрос, чтобы включить оба "направления"?

  • 0
    почему у вас есть исходящий 1 для SKU1, у вас есть dest_loc LOC1 и LOC2 .. если вы хотите исходящий, у вас должно быть 2 для этого sku ... пожалуйста, проверьте ..
  • 0
    Как упомянуто выше, Ваше outbound значение для sku1 должно быть 2 на основе логики.
Показать ещё 4 комментария
Теги:

2 ответа

0
Лучший ответ

Вы ищете несколько инструкций WHERE. Они могут быть помещены в SELECT в качестве условных:

SELECT 
  sku,
  SUM(IF(dest_loc   = 'LOC1', 1, 0)) AS inbound,
  SUM(IF(source_loc = 'LOC1', 1, 0)) AS outbound,
  SUM(IF(dest_loc   = 'REC' , 1, 0)) AS recycle
FROM skudata
GROUP BY sku
0

Глядя на ваши данные, кажется, что вы ищете отличный счет

SELECT sku, 
      count(distinct source_loc) inbound, 
      count(distinct dest_loc) outbound, 
      sum(case when dest_loc ='REC' then 1 else 0 end) recycle
FROM skudata
GROUP BY 'sku'
ORDER BY 'sku';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню