Агрегирование результатов SQL-результатов

Я пытаюсь обобщить некоторые результаты, но мне не повезло. Вот SQL, который я использую, и фактический вывод:

SQL Statement, который подготовил эти данные:

SELECT 
 i.inventory_item_id, 
 i.organization_id, 
 sum(primary_transaction_quantity) as on_hand_qty
FROM mtl_onhand_quantities_detail oqd, mtl_system_items_b i
WHERE oqd.inventory_item_id = i.inventory_item_id
 AND oqd.inventory_item_id = 117567 -- just used to restrict results for this example
 AND i.organization_id = :p_organization_id
 AND oqd.organization_id = i.organization_id
GROUP BY i.inventory_item_id, i.organization_id, primary_transaction_quantity


INVENTORY_ITEM_ID,ORGANIZATION_ID,ON_HAND_QTY
117567,7651,2
117567,7651,1

Что мне нужно вернуть:

INVENTORY_ITEM_ID,ORGANIZATION_ID,ON_HAND_QTY
117567,7651,3

В принципе, он должен суммировать on_hand_qty и возвращать только одну результирующую строку, если inventory_item_id и organization_id одинаковы. Любая помощь очень ценится!

2 ответа

Хорошо, поэтому основная проблема, с которой вы столкнулись, состоит в том, что вы включили свой агрегатный оператор в свою GROUP BY чтобы ваш запрос выглядел так.

SELECT 
 i.inventory_item_id, 
 i.organization_id, 
 sum(primary_transaction_quantity) as on_hand_qty
FROM mtl_onhand_quantities_detail oqd, mtl_system_items_b i
WHERE oqd.inventory_item_id = i.inventory_item_id
 AND oqd.inventory_item_id = 117567 -- just used to restrict results for this example
 AND i.organization_id = :p_organization_id 
 AND oqd.organization_id = i.organization_id
GROUP BY i.inventory_item_id, i.organization_id

Не знаете, какую СУБД вы используете, однако, если вы ищете группу на google, вы должны найти много объяснений относительно того, как она работает.

Теперь давайте перейдем к следующей проблеме. Вы используете синтаксис соединения pre ansi-92. Это плохо.

Ваш код должен выглядеть так.

SELECT 
 i.inventory_item_id, 
 i.organization_id, 
 sum(primary_transaction_quantity) as on_hand_qty
FROM mtl_onhand_quantities_detail oqd
INNER JOIN mtl_system_items_b i
 ON oqd.inventory_item_id = i.inventory_item_id
 AND oqd.organization_id = i.organization_id
 AND i.organization_id = :p_organization_id --Added back the function now that I know it isn't a typo
WHERE 
 oqd.inventory_item_id = 117567 -- just used to restrict results for this example
GROUP BY i.inventory_item_id, i.organization_id


удалить primary_transaction_quantity из вашей группы по предложению

licensed under cc by-sa 3.0 with attribution.