"Check capacity availability in spaces" 与 SQL 服务器
"Check capacity availability in spaces" with SQL Server
我有一个仓库,在货架上有 space 个方格,用于放置我的产品,这些产品尺寸相同且装在盒子里。
货架上有 space 个,大小不一,我最多可以放 X 个盒装产品。 space 的大小可以是可变的。出于这个原因,我有 table Space 列 MaximumCapacity
.
我正在尝试将这些 space 映射到一个系统中,以了解是否仍有容量可用并快速找到我的 space 可以容纳另一个盒装产品的机架。这可以代表仓库的层次结构
+ Warehouse (1 warehouse)
+ Racks (5 000 racks)
+ Spaces (10 000 spaces)
+ Products (1 to N per space)
我一直在尝试做一个 SQL Server 2008 视图来获取我的 spaces 与产品。
我有一个 Space table,其中有一列 MaximumCapacity
来指定其中可以容纳多少产品。我有另一个 table 叫做 ProductLocation
.
我正在执行左连接以首先检索我的 space 及其所有产品分配或位置。
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# 中以更好的方式重新排列,但重点是,为了避免检索 spaces 的网络流量没有更多的产品空间,我只想检索记录与可用容量。我一直试图弄清楚没有成功。在结果示例中,SPACE3 的最大容量为 2,并且那里已经有 2 个产品(PRODUCT4 和 PRODUCT5)。
我如何根据 space 的最大容量过滤 (WHERE) 以避免最后两行,最终得到这个:
Code - Maximum capacity - ProductCode
-----------------------------------------
SPACE 1 - 4 - PRODUCT1
SPACE 1 - 4 - PRODUCT2
SPACE 2 - 8 - PRODUCT3
我在没有更多空间的情况下检索所有不必要的 space 时遇到性能问题。
提前致谢。
这应该可以解决问题
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
请试试这个。
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');
计算每个 space 的产品数量,并排除少于最大值的产品。
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
我有一个仓库,在货架上有 space 个方格,用于放置我的产品,这些产品尺寸相同且装在盒子里。
货架上有 space 个,大小不一,我最多可以放 X 个盒装产品。 space 的大小可以是可变的。出于这个原因,我有 table Space 列 MaximumCapacity
.
我正在尝试将这些 space 映射到一个系统中,以了解是否仍有容量可用并快速找到我的 space 可以容纳另一个盒装产品的机架。这可以代表仓库的层次结构
+ Warehouse (1 warehouse)
+ Racks (5 000 racks)
+ Spaces (10 000 spaces)
+ Products (1 to N per space)
我一直在尝试做一个 SQL Server 2008 视图来获取我的 spaces 与产品。
我有一个 Space table,其中有一列 MaximumCapacity
来指定其中可以容纳多少产品。我有另一个 table 叫做 ProductLocation
.
我正在执行左连接以首先检索我的 space 及其所有产品分配或位置。
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# 中以更好的方式重新排列,但重点是,为了避免检索 spaces 的网络流量没有更多的产品空间,我只想检索记录与可用容量。我一直试图弄清楚没有成功。在结果示例中,SPACE3 的最大容量为 2,并且那里已经有 2 个产品(PRODUCT4 和 PRODUCT5)。
我如何根据 space 的最大容量过滤 (WHERE) 以避免最后两行,最终得到这个:
Code - Maximum capacity - ProductCode
-----------------------------------------
SPACE 1 - 4 - PRODUCT1
SPACE 1 - 4 - PRODUCT2
SPACE 2 - 8 - PRODUCT3
我在没有更多空间的情况下检索所有不必要的 space 时遇到性能问题。
提前致谢。
这应该可以解决问题
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
请试试这个。
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');
计算每个 space 的产品数量,并排除少于最大值的产品。
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