Группировка по частичной стоимости - PullRequest
1 голос
/ 28 июля 2011

Я очень плохо знаком с SQL и не знаю, как начать с этого. У меня есть две таблицы: склад и предметы. Вот как они выглядят (упрощенно):

Склад

ItemID | QuantityInStock | QuantityOnOrder | QuantityOnOrder2 | QuantityOnOrder3 | QuantityOnOrder4
-------+-----------------+-----------------+------------------+------------------+-----------------
1111   |               8 |               1 |                0 |                1 |               0 
2222   |               3 |               0 |                0 |                0 |               0 
3333   |               4 |               0 |                1 |                0 |               0 

Продукты

ItemID | Code
-------+-----------------
  1111 | abc123456-111-01
  2222 | abc123456-111-02
  3333 | abc123457-112-01 

Что мне нужно вернуть с помощью SQL-запроса:

ShortCode | Quantity
----------+---------
abc123456 | 9
abc123457 | 3
  • ItemID - это ключ для объединения обеих таблиц
  • Код в таблице товаров включает в себя основной код продукта (abc123456) и варианты (-111-01). Мне нужно сгруппировать строки только по основному коду продукта
  • Количество, которое мне нужно, исходит из таблицы Warehouse, и оно равно «Количество в запасе - Количество в количестве - Количество в количестве 2 - Количество в количестве 3 - Количество в количестве 4». Используя это, мы получаем abc123456 (поставляется в двух вариантах в таблице Items с ItemId 1111 и 2222), а количество равно 8 минус 1 минус 0 минус 1 минус 0 для 1111 и 3 минус 0 минус 0 минус 0 минус 0 для 2222, что вместе дает 9 * * тысяча двадцать-один

Это, наверное, худшее объяснение за всю историю, поэтому я надеюсь, что найдется кто-то, кто сможет это понять.

Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Если вы всегда можете рассчитывать на совпадение с первыми 9 символами столбца Код, тогда следующий запрос должен работать.

/// note that the SUM method may return a negative (-) number
SELECT LEFT(I.[Code], 9) AS 'ShortCode', SUM([QuantityInStock] - [QuantityOnOrder] - [QuantityOnOrder2] - [QuantityOnOrder3] - [QuantityOnOrder4]) AS 'Quantity'
FROM [dbo].[Warehouse] AS W
INNER JOIN [dbo].[Items] AS I ON I.[ItemId] = W.[ItemId]
GROUP BY LEFT(I.[Code], 9)
2 голосов
/ 28 июля 2011

Использование стандартного SQL:

SELECT 
  LEFT(Items.Code, 9) AS ShortCode, 
  SUM(T.remaining) AS Quantity 
FROM Items
JOIN ( 
  SELECT 
    ItemID, 
    QuantityInStock - QuantityOnOrder - QuantityOnOrder2 - QuantityOnOrder3 - QuantityOnOrder4 AS remaining 
  FROM Warehouse
) AS T ON (T.ItemID = Items.ItemID)
GROUP BY LEFT(Items.Code, 9);

Не проверено, но должно работать. Единственная потенциальная проблема заключается в том, что вы используете заглавные буквы в именах таблиц и столбцов, поэтому вам может потребоваться заключить все имена таблиц и столбцов в обратные кавычки (`) или квадратные скобки в зависимости от сервера БД.

РЕДАКТИРОВАТЬ: Если вы хотите отфильтровать те, у кого осталось менее определенного количества частей, просто добавьте:

HAVING SUM(T.remaining) > xxx

Где xxx - минимальное количество, которое вы хотите

...