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 に答える