sql 2000选择满足多行条件的id

sql 2000选择满足多行条件的id,sql,sql-server-2000,Sql,Sql Server 2000,我正在努力让我的头围绕这个sql 我有一个函数,返回与BOM表关联的项目列表 sql选择的结果 SELECT BOM, ITEMID, QTY FROM boms WHERE bom='A' 是 现在,使用该结果集,我希望查询我的salestable,以查找ITEMB和ITEMC销售数量足够的销售额 salestable的格式如下所示 SELECT salesid, itemid, sum(qtyordered) 'ordered' FR

我正在努力让我的头围绕这个sql

我有一个函数,返回与BOM表关联的项目列表

sql选择的结果

SELECT
    BOM,
    ITEMID,
    QTY
FROM boms
WHERE
    bom='A'

现在,使用该结果集,我希望查询我的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中,该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
)

您可以执行此聚合和having子句:


having子句中的每个条件都是计算每个项目的行数。

这将返回所有销售的精确匹配,即相同的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');
如果要退回数量大于BOM.qty的销售,则必须相应更改联接:

JOIN 
  boms AS b
ON b.itemid = s.itemid
AND b.QTY <= s.ordered

未经测试…

我认为这可能会得到您需要的结果。您必须将@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

根据我收集的信息,第一个查询用于获取返回合格销售的阈值?基于您的示例数据行,我假设每个salesid+itemid只有一行,基本上充当salesline表中的双字段主键?如果这是真的,我认为没有必要像在第二个示例查询中那样进行求和。如果我的任何假设有误,请告诉我,我会调整我的答案。

我不明白您为什么需要第一个查询。也许你能更清楚地解释一下这个问题?您是如何获得“足够数量的销售”金额的?此外,您的第二个查询是否有效?我认为应该有一个聚合函数,比如SUM work,你必须有一个GROUP BY子句?Hi@Ryan-是的,关于第二个查询,你是对的-这是实际select的一个非常简化的版本。我已对其进行了编辑,以包括分组依据。至于为什么第一个-我需要找到BOM表A首先由哪些组件组成,以及每个项目需要多少。这将仅针对单个BOM运行吗?@dnoeth-是-我正在考虑制作一个UDF,将BOM表id作为输入,然后返回该BOM表的销售数量。假设命中率不太差,那么它应该可以工作。嗨@Ryan-我确实需要这个总数,因为我们的系统只允许qtyorderd为1!!!!因此,我们需要为多个数量设置单独的行!好的,编辑查询。如果你得到了想要的结果,请告诉我。这对我的数据不起作用-它返回的销售额比预期的多@下面的第二个代码似乎对我有用。谢谢你的时间-我很感激。谢谢你的帮助-对于minor mods,这正是我所需要的:-谢谢你的回答,但是上面的@dnoeth代码可以动态工作,而我不必知道相关BOM的组件。
JOIN 
  boms AS b
ON b.itemid = s.itemid
AND b.QTY <= s.ordered
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