Запрос SQL выбрать все заказы по условию совпадения нескольких значений

Все в рамках одной таблицы ORDER.

В таблице 3 поля ORDERID, LINEID И ORDERSEQ

Всего есть 50 заказов, по 50 строк в каждом, то есть для одного номера заказа (ORDERID) будет 50 строк в таблице.

В поле ORDERSEQ для каждой LINEID могут быть значения 1или 2, или NULL.

Задача выбрать только те заказы, в которых в поле ORDERSEQ для всех 50-ти строк LINEID 1 и/или 2, то есть нет пустых значений.

Примечание: в целом в заказах могут быть разное количество строк, от 1 до 999999, 50 только как пример, но суть в том, что надо для каждого заказа проверять на совпадения по всем строкам заказа.

Пример на 4 заказах, в таблице 15 строк, селект должен отобрать 6 из них через проверку поля ORDERSEQ: по всем LINEID в разрезе одного заказа, поле ORDERSEQ должны быть заполнены значениями 1 и/или 2.

введите сюда описание изображения


Ответы (2 шт):

Автор решения: Yitzhak Khabinsky

"Минимальный воспроизводимый пример" не предоставлен. Стреляю от бедра.

SQL

;WITH rs AS
(
   SELECT * 
      , total_count = COUNT(*) OVER (PARTITION BY OrderID ORDER BY OrderID)
      , GroupB_count = SUM(IIF (ORDERSEQ IN (1,2), 1, 0)) OVER (PARTITION BY OrderID ORDER BY OrderID)
   FROM [Order]
)
SELECT * 
FROM rs
WHERE total_count = GroupB_count;
→ Ссылка
Автор решения: Павел Викторович

Нужен пример таблиц, пока ничего не понятно.

"В поле ORDERSEQ для каждой LINEID могут быть значения 1или 2, или NULL." - Вы написали, что они находятся в одной и той же таблице - как они могут быть "поле ORDERSEQ для каждой LINEID" ?

На сколько понимаю задачу, отбросив некоторые аспекты написанного вопроса - то мы можем примерно такой запрос построить:

SELECT o.* FROM order o GROUP BY o.orderid HAVING o.orderseq NOT NULL

или

SELECT o.* FROM order o GROUP BY o.orderid HAVING o.orderseq IN(1,2)

Т.е. мы сгруппировали все по orderid, затем из группы выбрали orderseq все что не NULL, во втором случае мы выбрали равные 1 иил 2

LINEID - на сколько понимаю, id записи в таблице -)

UPD: После получения дополнительной информации:

SELECT o.* FROM `order` o WHERE o.ORDERID NOT IN (SELECT o1.ORDERID FROM `order` o1 WHERE o1.ORDEESEQ IS NULL GROUP BY o1.ORDERID)

Что мы здесь делаем? - В подзапросе выбираем записи, которые имеют ORDEESEQ явно NULL - и применяем к нему NOT IN, т.е. все ID, таким образом получаем набор данных, согласно дополнительной информации. Почему не будет работать, в подзапросе, указав IS NOT NULL? все очень просто - все поля, а именно группы ТОЧНО имеют не NULL значения, так как в каждой группе существует 1,2, таким образом выведет ВСЕ результаты групп, поэтому выбираем целевое - те поля, которые наоборот, конкретно нужно исключить из результата, а далее применяем обычный NOT IN )

→ Ссылка