0

私はこの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
)
4

3 に答える 3

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各アイテムの行数をカウントしています。

于 2013-09-16T13:31:58.243 に答える