我正在努力解决这个问题。
我有一个函数可以返回与物料清单BOM相关联的项目列表。
sql select
的结果SELECT
BOM,
ITEMID,
QTY
FROM boms
WHERE
bom='A'
是
BOM | ITEMID | QTY
A | ITEMB | 1
A | ITEMC | 2
现在使用该结果集我希望查询我的salestable以找到销售数量足够的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,它只返回指定时间段内指定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
)
答案 0 :(得分:1)
这应该返回具有完全匹配的所有销售,即相同的itemid和相同的数量:
SELECT s.salesid
FROM
(
SELECT salesid, itemid, SUM(qtyordered) AS ordered
FROM salesline AS s
GROUP BY salesid, itemid
) AS s
JOIN
boms AS b
ON b.itemid = s.itemid
AND b.QTY = s.ordered
WHERE b.BOM='A'
GROUP BY s.salesid
HAVING COUNT(*) = (SELECT COUNT(*) FROM boms WHERE BOM='A');
如果您想要返回数量大于boms.qty的销售,您需要相应地更改联接:
JOIN
boms AS b
ON b.itemid = s.itemid
AND b.QTY <= s.ordered
未经测试...
答案 1 :(得分:0)
您可以执行此聚合和having
子句:
select salesid
from salesline sl
group by salesid
having sum(case when itemid = 'ITEMB' then 1 else 0 end) > 0 and
sum(case when itemid = 'ITEMA' then 1 else 0 end) > 0;
having
子句中的每个条件都计算每个项目的行数。
答案 2 :(得分:0)
我认为这可能会为您提供所需的结果。你必须用你的bom替换@BOM:
SELECT
DISTINCT salesid
FROM
salesline sl
INNER JOIN boms b ON
b.bom = @BOM
AND b.itemid = sl.itemid
GROUP BY salesid, itemid
HAVING SUM(qtyordered) >= b.qty
从我收集的信息中,第一个查询用于获取返回合格销售的阈值?基于您的示例数据行,我假设salesline表中每个salesid + itemid(基本上充当双字段主键)只有一行?如果这是真的,我认为不需要像在第二个示例查询中那样进行SUM。如果我在任何假设中都弄错了,请告诉我,我会调整我的答案。