2015-11-23 4 views
0

У нас есть система управления запасами, которая состоит из каталога товаров, инвентаря и активов. В настоящее время у нас есть запись для каждой части инвентаря, но теперь мы реализуем количество как в таблице Inventory, так и в таблице Assets. Например, данные в таблице Inventory выглядит примерно так:Удалить количество записей и обновлений

InventoryID | ItemID 
---------------------- 
100   | 5 
101   | 5 
102   | 5 
103   | 5 
104   | 9 
105   | 5 

Что теперь мы хотим сделать, это объединить записи с тем же ItemID и поставить Количество в поле:

InventoryID | ItemID | Quantity 
--------------------------------- 
100   | 5  | 5 
104   | 9  | 1 

У меня есть тысячи записей, которые нуждаются в слиянии и хотели бы знать более быстрый способ сделать это вместо текущего способа, который находит записи, получает счет, удаляет все, кроме последней записи, и обновляет поле количества со счетом (все делается вручную в SSMS, а не через любые скрипты).

Любая помощь/предложения будут оценены.

+1

Вопрос помечен как SQL, а опубликованный код - таблицы HTML? Я бы предложил написать SQL-скрипт для обработки этого слияния. –

+0

Извините, это был единственный способ, которым я знал, как заставить таблицы отображать данные несколько должным образом. Если вы скажете мне, как и показать мне, где я могу научиться это делать, я был бы рад изменить его. – Robert

ответ

2

Сделать временную таблицу и вставить:

SELECT MIN(InventoryID), ItemID, COUNT(*) as Quantity 
FROM Inventory 
INTO #TEMP 
GROUP BY ItemID 

Затем обновите основную таблицу (создать столбец количества первой, если у вас нет):

UPDATE I 
SET I.Quantity = T.Quantity 
FROM #TEMP 
WHERE I.InventoryID = T.InventoryID and I.ItemID = T.ItemID 

Затем удалите дополнительную запись из инвентаря

DELETE 
FROM INVENTORY 
WHERE InventoryID not in(
    SELECT InventoryID 
    FROM #TEMP) 
+0

Спасибо за это ..... Я смог использовать это в сочетании с некоторыми из моих других скриптов, чтобы заставить его работать. – Robert

0

Предполагая, что у вас есть поле количества в таблице инвентаря, вы можете обновить это поле, а затем удалить ненужные записи.

UPDATE Inventory 
SET Inventory.Quantity = Computed.QCount 
FROM Inventory 
INNER JOIN 
(
    SELECT InventoryId, COUNT(*) as QCount 
     FROM Inventory 
    GROUP BY InventoryId 
) as Computed 
on Inventory.ItemId = Computed.ItemId 

--Now Delete Duplicates 

DELETE Inventory 
FROM Inventory 
LEFT OUTER JOIN (
    SELECT MIN(InventoryId) as RowId, ItemId 
    FROM Inventory 
    GROUP BY ItemId 
) as KeepRows ON 
    Inventory.InventoryId = KeepRows.RowId 
WHERE 
    KeepRows.ItemId IS NULL 
+0

Правда, но есть ли способ получить количество, удалить все, кроме 1 записи, для этого ItemID, а затем обновить эту запись с количеством? – Robert

+0

Да, есть несколько способов сделать это. Вы можете добавить столбец количества, а затем обновить его, используя запрос выше для ВСЕХ записей, затем вы можете удалить дубликаты на основе информации, которую вы хотите использовать как уникальные идентификаторы (подсказка: not inventoryId). Вот дубликат запроса, который я использую: http://stackoverflow.com/a/18949/2868359 – Chizzle

0

Простой скрипт может создать новую таблицу, которую вы хотите, а затем уничтожить вашу старую таблицу и заменить данные с новым.

Например, что-то вроде

SELECT 
    MIN(InventoryID) AS InventoryID, 
    ItemID, 
    COUNT(*) AS Quantity 
INTO 
    NewInventoryTable 
FROM 
    Inventory 
GROUP BY 
    ItemID 
Смежные вопросы