2011-12-27 4 views
1

У меня есть две таблицы
SQL запрос для добавления значения столбца для сравнения с колонкой

table_inventory 
    List item 
    inventory_rack_key(primarykey) 
    node_key 
    rack_id 
    inventory_item_key 
    in_coming_qty,locked_qty 
    quantity 

table_item 
    inventory_item_key(primary key) 
    item_id,product_zone 

В примере таблицы приведены здесь DB TABLES
мне нужно запросить, чтобы узнать те элементы, для которых (net_qty) т.е. разница b/w сумма in_coming_qty & quantity & locked_qty отрицательный. node_key,rack_id, item_id,net_qty

Примечание: каждый отдельный комплект {node_key,rack_id, item_id,net_qty} будет иметь только 1 рядный выход. Для ex :{node_key,rack_id, item_id} = {ABD101, RK-01,562879} имеет 4 строки в table_inventory , но в выводе net_qty = -78 (одна строка).

Запрос, который я сделал, дает мне результат, но можем ли мы сделать это каким-то другим способом?

SELECT l.node_key, 
     l.rack_id, 
     i.item_id, 
     (SUM(l.quantity + l.in_coming_qty) - SUM(l.locked_qty)) AS net_qty 
FROM table_inventory l, 
     table_item i 
WHERE l.inventory_item_key = i.inventory_item_key 
GROUP BY l.node_key, 
      l.rack_id, 
      i.item_id 
HAVING SUM(l.quantity + l.in_coming_qty) - SUM(l.locked_qty) < 0 
+2

Почему ваш ответ неприемлем? – mwigdahl

+0

@mwigdahl мой ответ правильный, но есть ли другой способ сделать то же самое. – 2FaceMan

+1

Если у вас нет непосредственной проблемы с вашим текущим решением (например, непоследовательные результаты, слишком медленно и т. Д.), Вы можете рассмотреть возможность размещения на http: // codereview. stackexchange.com/, который предназначен для таких вопросов. –

ответ

4

Не совсем. Существует этот второстепенный вариант:

select v.* from (
SELECT l.node_key, 
     l.rack_id, 
     i.item_id, 
     SUM(l.quantity + l.in_coming_qty - l.locked_qty) AS net_qty 
FROM table_inventory l, 
     table_item i 
WHERE l.inventory_item_key = i.inventory_item_key 
GROUP BY l.node_key, 
      l.rack_id, 
      i.item_id 
) v 
where net_qty < 0 

- это означает, что расчет SUM нужно только закодировать один раз, но вы все еще должны сделать SUM.

+0

Это менее громоздко, спасибо – 2FaceMan

+0

Просьба также использовать синтаксис ANSI 'JOIN' - это поможет вам изолировать вас от возможности, что ошибка в предложении' WHERE' может вызвать декартово 'JOIN'. – mwigdahl

+1

Вообще-то, это не то же самое. Например, если есть строки, где 'locked_qty' имеет значение NULL, а' количество' и 'in_coming_qty' не являются (или наоборот), результаты двух запросов будут разными. Тем не менее, эти NULL не кажутся очень вероятными, судя по именам столбцов, и ваш аргумент о расчете SUM тоже стоит. –

Смежные вопросы