sql 2000 select id满足多行条件的id

时间:2013-09-16 13:05:34

标签: sql sql-server-2000

我正在努力解决这个问题。

我有一个函数可以返回与物料清单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
)

3 个答案:

答案 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。如果我在任何假设中都弄错了,请告诉我,我会调整我的答案。