2013-07-29 3 views
1

У меня есть программа, использующая SQL Server 2005 Express, и мне нужна помощь в двух таблицах для расчета запасов.Для Loop в SQL Server 2005 Express?

  • Table 1: магазины все продукты с общей инвентаризации до настройки
  • Table 2: хранит сделки против всех продуктов из таблицы 1

Как я могу Переберите всех элементов в таблице 2 и вычесть, что количество из таблицы 1 считается?

Если у меня есть запрос, как это, то я получаю данные для каждого продукта

SELECT 
    ii.ItemNum, ii.ItemName, ii.OzOnHand 
FROM 
    dbo.InventoryItems ii 
INNER JOIN 
    dbo.InventoryLog il ON ii.ItemNum = il.InvItemNum 
WHERE 
    ii.active = 1 

мне нужно каждое вхождение из таблицы 2 следует вычесть из общей суммы таблицы 1 по

+1

Когда у вас есть запрос на решение, и вы думаете: «Я буду использовать цикл для этого» - отступите назад и подумайте еще раз. SQL оптимизирован для работы с наборами, а не для циклического перехода по одной строке за раз. –

ответ

4

Это Примердлительногопребывание присоединиться к агрегированной таблице (я думаю, что это лучший способ понять это):

SELECT ii.ItemNum, ii.ItemName, ii.OzOnHand, ii.OzOnHand - coalesce(il.cnt, 0) 
FROM dbo.InventoryItems ii LEFT JOIN 
    (select il.InvItemNum, sum(OzRemoved) as cnt 
     from dbo.InventoryLog il 
     group by il.InvItemNum 
    ) il 
    ON ii.ItemNum = il.InvItemNum 
WHERE ii.active = 1; 

подзапроса группа все в журнале и подсчитывает количество записей. Если каждая запись может повлиять на более чем один элемент, вы должны использовать что-то вроде sum(cnt) as cnt вместо count(*).

Затем в запросе используется left outer join. Этот тип соединения гарантирует, что все элементы инвентаря остаются, даже те, у которых ничего нет в журнале. Наконец, счет вычитается из того, что доступно в настройке. coalesce() предназначен для обработки ситуации, когда в таблице журналов нет совпадений. Чтобы избежать получения NULL, NULL превращается в 0.

+0

Это очень близко. Вместо вычитания 'count' элементов, которые соответствуют таблице InventoryLog, мне нужен номер из этого столбца' OzRemoved'. Таким образом, запрос, который вы предложили удалить 9 из «OzOnHand» вместо суммы из «OzRemoved» в той же таблице – Matt

+2

@Matt, чтобы быть справедливым, в ваш вопрос даже не упоминался столбец «OzRemoved», нечего намекать, что это это «счет», за которым вы были. В любом случае, я подозреваю, что вы можете взять ответ Гордона отсюда и просто изменить 'COUNT (*)' на 'SUM (OzRemoved)'. –

+0

Да, извините, @aaron, я только что понял, что у меня не было этого поля в вопросе. Я изменил это, прежде чем вы прокомментировали, и я думаю, что сейчас у меня есть правильные цифры ... нужно проверить еще несколько образцов – Matt

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