2016-11-25 16 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보기를 수행하려고했습니다.

여기에 보유 할 수있는 제품 수를 지정하는 MaximumCapacity 열이있는 공간 테이블이 있습니다. ProductLocation이라는 테이블이 있습니다.

왼쪽 공백을 사용하여 내 공백과 모든 공백 또는 제품의 할당 또는 위치를 검색합니다. 더 이상 방 공간을 검색하는 네트워크 트래픽을 방지하기 위해,

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

이 데이터는 C#에서 더 나은 방식으로 재 배열이

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

뭔가를 반환하지만, 요점은 제품의 경우 사용 가능한 용량으로 레코드를 검색하려고합니다. 나는 성공하지 않고 알아 내려고 노력했다. 결과의 예에서 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은 해당 용량 공간의 일부를 나타냅니다. 따라서 ProductLocation에 2 개의 제품을 추가하면 1 개의 제품에 대한 공간이 생깁니다. 1 개 더 제품을 추가하면. 제품 수 = 3 대 공간 용량 = 3이면 행을 건너 뜁니다. –

+0

그래서, 네? ProductLocation의 각 제품/행은 공간 테이블에서 MaximumCapacity의 정확히 한 공간을 차지합니까? – 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