Запрос 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 шт):
"Минимальный воспроизводимый пример" не предоставлен. Стреляю от бедра.
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 )
