0

我不知道该往哪里走。这就是我想要做的......想象有一个“系统”,里面有 5 个盒子......每个盒子有 10 个可以容纳物品的口袋。该数据库在口袋级别跟踪库存。我需要一个 itemid 的列表,它们不在父“系统”中的任何位置(假设它们仍然可能在其他系统的口袋中。

tblpocket
----------
systemid, itemid, pocketid, curqty
1,        PFLI,   12,       0      
1,        MEP50,  16,       0       
1,        PFLI,   20,       0       
1,        OND5,   32,       0       
2,        OXBUT,  10,       0       
2,        DIPL,   12,       0       
2,        OXBUT,  16,       1       
2,        PFLI,   18,       1

除了 "OXBUT" itemid 之外的所有项目都需要返回。您还可以看到如何进行子选择以排除 itemid curqty > 0 的位置将它从结果中完全排除在 systemid 1 上的缺货位置。

我有 300 个 SystemID 和数千个 ItemID,所以一次做 systemid 不是一种选择。

这是我开始做的事情:

SELECT systemid, itemid
FROM TblPocket
WHERE curqty = 0 AND itemid NOT IN
 (Select itemid from tblpocket where curqty > 0)
GROUP BY systemid, itemid

这就是我被绊倒的地方.... :( 提前感谢您的想法 :)

4

1 回答 1

1

如果我理解你的问题。. . 您正在寻找系统中 curqty = 0 的项目。但是,一件物品可能在多个口袋中。这似乎是对“我需要一个 itemid 列表,它们不在父“系统”中的任何位置(假设它们仍然可能在其他系统中的口袋里)的合理解释。

这是一个聚合查询:

select systemid, itemid
from TblPocket
group by systemid, itemid
having sum(curqty) = 0
order by systemid

但是,您的 OXBUT 示例提出了一些不同的建议:项目要么全为 0,要么永远不为 0。这是对HAVING子句的简单修改:

select systemid, itemid
from TblPocket
group by systemid, itemid
having sum(case when curqty = 0 then 1 else 0 end) = 0 or  -- all not zero
       sum(case when curqty > 0 then 1 else 0 end) = 0     -- all zero
order by systemid
于 2012-09-25T13:44:59.067 回答