私はこのSQLを理解するのに苦労しています。
部品表 BOM に関連付けられたアイテムのリストを返す関数があります。
SQL 選択の結果
SELECT
BOM,
ITEMID,
QTY
FROM boms
WHERE
bom='A'
は
BOM | ITEMID | QTY
A | ITEMB | 1
A | ITEMC | 2
この結果セットを使用して、salestable にクエリを実行し、ITEMB と ITEMC が十分な数量で販売されている売上を見つけようとしています。
販売テーブルの形式は次のとおりです。
SELECT
salesid,
itemid,
sum(qtyordered) 'ordered'
FROM salesline
WHERE
itemid='ITEMB'
or itemid='ITEMC'
GROUP BY salesid, itemid
これは私に次のようなものを与えるでしょう
salesid | itemid | ordered
SO-10000 | ITEMB | 1
SO-10001 | ITEMB | 1
SO-10001 | ITEMC | 1
SO-10002 | ITEMB | 1
SO-10002 | ITEMC | 2
理想的には、SO-10002 のみを返品したいと考えています。これは、必要なユニットがすべて販売された唯一のセールです。
任意の提案をいただければ幸いです。理想的には、1 つのクエリが理想的ですが、それが可能かどうかはわかりません。これは週に 1 回早朝に実行されるため、パフォーマンスは必須ではありません。
編集
常に優れた助けを借りて、コードが完成しました。指定された期間の指定された BOM の売上を単純に返す UDF にすべてまとめました。
機能は
CREATE FUNCTION [dbo].[BOMSALES] (@bom varchar(20),@startdate datetime, @enddate datetime)
RETURNS TABLE
AS
RETURN(
select count(q.SALESID) SOLD FROM (SELECT s.SALESID
FROM
(
SELECT s.SALESID, ITEMID, SUM(qtyordered) AS SOLD
FROM salesline s inner join SALESTABLE st on st.salesid=s.SALESID
where st.createddate>=@startdate and st.CREATEDDATE<=@enddate and st.salestype=3
GROUP BY s.SALESID, ITEMID
) AS s
JOIN dbo.BOM1 AS b ON b.ITEMID = s.ITEMID AND b.QTY <= s.SOLD
where b.BOM=@bom
GROUP BY s.SALESID
HAVING COUNT(*) = (SELECT COUNT(*) FROM dbo.BOM1 WHERE BOM = @bom)) q
)