2016-11-25 6 views
1

私は、同じサイズで箱に入っている私の製品を置くためにラックのスペースを二乗した倉庫を持っています。SQL Serverで "空き容量を確認する"

ラックには大きさが異なるスペースがあり、最大でXの箱入り品を入れることができます。スペースのサイズは可変にすることができます。その理由のために、私はカラムがあるテーブルスペースを持っていますMaximumCapacity

これらのスペースをシステムにマップして、まだ空き容量があるかどうかを知り、スペースに別のボックス製品を保持できるラックをすばやく指定しようとしています。これは私が私のスペース対の製品を取得するために、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)があります。私がいないと、すべての不要なスペースを取得するために、パフォーマンス上の問題を抱えている

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

:どのように私は最終的にこれを取得するスペースの最大容量に基づいて、これらの2つの最後の行を避けるために(WHERE)フィルタすることができ

より多くの部屋。

ありがとうございます。

+0

ProductLocationテーブルの各製品は、正確に1つのスペースを占有しますか?そうでない場合は、それに要するスペースの量はどのように決定されますか? – RBarryYoung

+0

スペースは最大容量で構成され、3とします。次に、ProductLocationはその容量スペースの一部を表します。したがって、ProductLocationに2つの製品を追加すると、1つの製品の余裕ができます。私は1つの製品を追加します。製品数= 3対スペース容量= 3の場合、行はスキップされます。 –

+0

だから、そう? ProductLocationの各製品/行は、スペーステーブルのMaximumCapacityの1つのスペースを正確に占有しますか? – 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 
関連する問題