2016-11-25 2 views
1

У меня есть склад, который имеет квадраты в стойках, чтобы поместить мои товары того же размера и в коробках.«Проверка доступности емкости в пробелах» с SQL Server

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

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

+ Warehouse (1 warehouse) 
    + Racks (5 000 racks) 
    + Spaces (10 000 spaces) 
     + Products (1 to N per space) 

Я пытался сделать SQL Server 2008 представление, чтобы получить свои места против продуктов.

У меня есть таблица Space с колонкой MaximumCapacity, чтобы указать, сколько продуктов можно удержать там. У меня есть другая таблица под названием ProductLocation.

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

SELECT 
    s.ID, s.Code, 
    s.MaximumCapacity, 
    pl.ProductCode 
FROM 
    Space s 
LEFT JOIN 
    ProductLocation pl ON s.ID = pl.SpaceID 

Это возвращает что-то вроде этого

Code - Maximum capacity - ProductCode 
----------------------------------------- 
SPACE 1 -   4  - PRODUCT1 
SPACE 1 -   4  - PRODUCT2 
SPACE 2 -   8  - PRODUCT3 
SPACE 3 -   2  - PRODUCT4 
SPACE 3 -   2  - PRODUCT5 

Эти данные будут перестраивается в лучшую сторону в C#, но дело в том, чтобы избежать сетевого трафика для получения места, не больше места для продукта я просто хочу получить записи с доступной емкостью. Я пытался понять без успеха. В примере результатов максимальная емкость SPACE3 равна 2 и уже имеет 2 продукта (PRODUCT4 и PRODUCT5).

Как можно отфильтровать (WHERE), чтобы избежать этих 2 последних строк, основываясь на максимальной мощности пространства, чтобы получить, наконец, это:

Code - Maximum capacity - ProductCode 
----------------------------------------- 
SPACE 1 -   4  - PRODUCT1 
SPACE 1 -   4  - PRODUCT2 
SPACE 2 -   8  - PRODUCT3 

У меня есть проблемы с производительностью, чтобы извлечь все ненужные пробелы с не больше места.

Заранее спасибо.

+0

Каждый ли продукт в таблице ProductLocation занимает ровно 1 пробел? Если нет, то как определяется размер, который он занимает? – RBarryYoung

+0

Пространство сконфигурировано с максимальной пропускной способностью, допустим, 3. Затем ProductLocation представляет часть этого пространства емкости. Поэтому, если я добавлю 2 продукта в ProductLocation, у меня будет место еще 1 продукт. Если я добавлю еще 1 продукт. Количество продуктов = 3 против Space = 3, тогда строки будут пропущены. –

+0

Итак, да? Каждый продукт/строка в ProductLocation занимает ровно одно пространство MaximumCapacity в таблице Space? – RBarryYoung

ответ

0

Пожалуйста, попробуйте это.

declare @Space table (ID int, Code varchar(20), MaximumCapacity int) 
declare @ProductLocation table(SpaceID int, ProductCode varchar(20)) 

insert into @Space values 
(1, 'Space 1', 4) 
,(2, 'Space 2', 8) 
,(3, 'Space 3', 2) 
insert into @ProductLocation values 
(1, 'Product1') 
,(1, 'Product2') 
,(2, 'Product3') 
,(3, 'Product4') 
,(3, 'Product5'); 

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

with cte as(
SELECT s.ID, 
    s.Code, 
    s.MaximumCapacity, 
    pl.ProductCode, 
    count(pl.SpaceID) over(partition by pl.spaceid) as ProductCount 
FROM @Space s 
LEFT JOIN @ProductLocation pl ON s.ID = pl.SpaceID 

)select ID, Code, MaximumCapacity, ProductCode from cte 
Where ProductCount<MaximumCapacity 
0

Это должно сделать трюк

declare @space table (spaceid int, maximumCapacity int); 

insert into @space values(1,4); 
insert into @space values(2,8); 
insert into @space values(3,2); 

declare @productlocation table (productcode varchar(10), spaceid int); 

insert into @productlocation values ('product1', 1); 
insert into @productlocation values ('product2', 1); 
insert into @productlocation values ('product3', 2); 
insert into @productlocation values ('product4', 3); 
insert into @productlocation values ('product5', 3); 

with cte as (
    select spaceid, 
     count(*) productcount 
    from @productlocation 
    group by spaceid 
) 
select s.spaceid, maximumCapacity, productcode 
from @space s 
inner join cte on s.spaceid = cte.spaceid 
inner join @productlocation p on s.spaceid = p.spaceid 
where cte.productcount < s.maximumCapacity 
Смежные вопросы