Мне нужно подготовить отчет, в котором я отслеживаю входящие и исходящие поставки из местоположения, в результате чего получается количество каждого из 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". Я мог бы запускать два запроса отдельно, но потом мне пришлось бы сшивать результаты вместе, что было бы болью. Как мне лучше написать запрос, чтобы включить оба "направления"?
Вы ищете несколько инструкций 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
Глядя на ваши данные, кажется, что вы ищете отличный счет
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';
outbound
значение дляsku1
должно быть 2 на основе логики.