Я пытаюсь написать запрос, который получит количество мест для определенного SKU в каждой «зоне расположения», а затем общее количество всех мест для целей консолидации.
Это код, который я использую для попытки:
WITH
C0R_Count AS (
SELECT sku_id, count(location_id) as Bulk_Count
FROM Inventory
where location_id like 'C0R%'
group by sku_id),
C0S_Count AS (
SELECT sku_id, count(location_id) as Bin_Count
FROM Inventory
where location_id like 'C0S%'
group by sku_id)
SELECT RANK() OVER (ORDER BY Bin_Count+Bulk_Count DESC)as Count_Rank,
Inventory.sku_id, Bin_Count, Bulk_Count,
(Bin_Count+Bulk_Count) as Total_Count
FROM Inventory, C0R_Count, C0S_Count
WHERE client_id = 'SDRY-US'
and site_id = 'USCOL1'
and Inventory.Sku_id = C0R_Count.Sku_id
and Inventory.Sku_id = C0S_Count.Sku_id
and (Bin_Count+Bulk_Count) > 9
GROUP BY Inventory.sku_id, Bin_Count, Bulk_Count
;
То, что происходит, - это результат, включающий только SKU, которые имеют хотя бы одно местоположение для Bulk_Count и Bin_Count .
Например, есть конкретный SKU, который отображается в 223 (Bin Count) местоположениях, но не отображается в местоположениях Bulk_Count. Это лучшие результаты, показанные с использованием текущего запроса, но SKU с общим счетом 223 будет иметь ранг 1, но его исключение, так как Bulk Count будет 0
COUNT_RANK SKU_ID BIN_COUNT BULK_COUNT TOTAL_COUNT
1 M10003NS-02A-.M 71 2 73
2 M10003NS-02A-.S 68 2 70
3 M10003NS-02A-.L 60 4 64
4 M10003NS-02A-.XL 61 2 63
Добавил следующее с использованием явной записи соединения и получил те же результаты.
WITH
C0R_Count AS (
SELECT /*+ materialize */
sku_id, count(location_id) as Bulk_Count
FROM Inventory
where location_id like 'C0R%'
group by sku_id),
C0S_Count AS (
SELECT /*+ materialize */
sku_id, count(location_id) as Bin_Count
FROM Inventory
where location_id like 'C0S%'
group by sku_id)
SELECT RANK() OVER (ORDER BY Bin_Count+Bulk_Count DESC)as Count_Rank,
Inventory.sku_id, Bin_Count, Bulk_Count,
(Bin_Count+Bulk_Count) as Total_Count
FROM Inventory
Left Join C0R_Count
on Inventory.Sku_id = C0R_Count.Sku_id
Left Join C0S_Count
on Inventory.Sku_id = C0S_Count.Sku_id
WHERE
client_id = 'SDRY-US'
and site_id = 'USCOL1'
and (Bin_Count+Bulk_Count) > 9
GROUP BY Inventory.sku_id, Bin_Count, Bulk_Count
;