我正在努力理解这个 sql。
我有一个函数,它返回与物料清单 BOM 关联的项目列表。
sql 选择的结果
SELECT
BOM,
ITEMID,
QTY
FROM boms
WHERE
bom='A'
是
BOM | ITEMID | QTY
A | ITEMB | 1
A | ITEMC | 2
现在使用该结果集,我希望查询我的销售表以查找 ITEMB 和 ITEMC 的销售量足够大。
salestable的格式如下
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,因为这是唯一一次售出所有必要单位的销售。
任何建议,将不胜感激。理想情况下,一个查询将是理想的,但我不确定这是否可能。性能不是必须的,因为这将在每周凌晨运行一次。
编辑
在始终出色的帮助下,代码现已完成。我已将其全部打包到一个 UDF 中,该 UDF 仅返回指定 BOM 在指定时间段内的销售额。
功能是
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
)