Я изо всех сил пытаюсь размахивать этим слоем.sql 2000 select id, где выполняются условия нескольких строк.
У меня есть функция, которая возвращает список элементов, связанных с спецификацией спецификаций.
Результат SQL выберите
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, поскольку это единственная продажа, где все необходимые единицы были проданы.
Любые предложения будут оценены. В идеале один запрос был бы идеальным, но я не уверен, что это возможно. Производительность не обязательна, так как это будет выполняться раз в неделю ранним утром.
EDIT
с всегда превосходной помощи, код завершен. Я завернул все это в 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>[email protected] and st.CREATEDDATE<[email protected] 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 [email protected]
GROUP BY s.SALESID
HAVING COUNT(*) = (SELECT COUNT(*) FROM dbo.BOM1 WHERE BOM = @bom)) q
)
Я не понимаю, почему вам нужен первый запрос. Возможно, вы могли бы объяснить проблему немного более четко? Как вы получаете сумму «продано в достаточном количестве»? Кроме того, работает ли ваш второй запрос? Я думал, что у вас есть сводная функция, такая как работа СУММ, у вас должен был быть предложение GROUP BY? – Ryan
Привет @Ryan - да, вы правы в отношении второго запроса - это была очень упрощенная версия фактического выбора. Я отредактировал его, чтобы включить группу. Что касается того, почему первое - мне нужно найти, какие компоненты BOM A состоит из первого и сколько из каждого элемента требуется. – l0ckm4
Будет ли это работать только для одного «bom»? – dnoeth