|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Sql - Не получается выбрать строки с разными условиями
Доброе время суток,
Суть: есть таблица (DEVICES), в которой, есть ID заявки (PROPOSAL_ID) на работу. По каждой заявке может быть разный вид работ (SORT_WORK_ID), например заявка с PROPOSAL_ID=30 (а также с разными суммами оплат), для которой вид работ: штукатурка, побелка, покраска соответственно с ID: 1, 2, 3 (SORT_WORK_ID) см. рис. Мне нужно каким-то образом, вытягивать PROPOSAL_ID, только тех заявок, для которых пользователь выделил определенный вид работ. Например: - Если пользователь выделил вид работ с SORT_WORK_ID = 1, т.е. «штукатурка», должна находится заявка только с штукотуркой, т.е. PROPOSAL_ID = 25. - Если пользователь выделил вид работ с SORT_WORK_ID = (1,2), то должны находится только заявки с штукатуркой и побелкой, т.е. PROPOSAL_ID = 28, 29 - Если пользователь выделил вид работ с SORT_WORK_ID = (1,2, 3), то должны находится только заявки с штукатуркой и побелкой и покраской, т.е. PROPOSAL_ID = 30. Поправка: И как еще этот запрос ограничить combobox`ом строгий поиск (галочка стоит) или нет (галочки нет): -- т.е. если строгий, то в результате запроса в него должны входить (PROPOSAL_ID) только те виды работ, которые выбрал пользователь (например пользователь выбрал SORT_WORK_ID = 1, тогда должна выбираться заявка с PROPOSAL_ID = 25 или SORT_WORK_ID in (1, 2), то PROPOSAL_ID = 28, 29); -- если не строгий, то в результат могут входить заявки с джругими видами работ SORT_WORK_ID = 1, то в результат попадут все заявки, т.к. все они имеют вид работы равный «1» Мой вариант (но он не совсем рабочий - при SORT_WORK_ID in (1,2,3) - не работает и не учитывает - "строгий" поиск или нет): Код:
select q.proposal_ID, count(*) from (select PROPOSAL_ID, SORT_WORK_ID, count(*) p from DEVICES D where SORT_WORK_ID in (1,2) group by PROPOSAL_ID, D.SORT_WORK_ID having count(*) > 1) q group by PROPOSAL_ID having count(*) > 1 Заранее спасибо за ответ P.S. sql, dialect 3, firebird 3.0.3 |
#2
|
|||
|
|||
С нестрогим поиском все понятно. Запрос с условием in () даст тебе все записи, где указаны соотв. типы. Т.е. нестрогий поиск будет выглядеть так:
Код:
select proposal_id from devices where sort_work_id in (:list) group by proposal_id Вариант 1. Когда нельзя ввести 2 заявки с одинаковыми proposal_id и sort_work_id. Код:
select proposal_id from devices where sort_work_id in (:list) group by proposal_id having count(*) = :n Теперь, если типы работ могут повторяться. Фактически, мы сводим задачу к предыдущей путем "сворачивания" пары proposal_id/sort_work_id в уникальную комбинацию (ну и фильтр внутрь подзапроса перенесем для оптимизации): Код:
select d.proposal_id from ( select distinct a.proposal_id, a.sort_work_id from devices a where a.sort_work_id in (:list) ) d group by d.proposal_id having count(*) = :n |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Konstantin-78 (12.02.2019)
|
#3
|
|||
|
|||
Вот тут еще вариант:
Код:
SELECT Q.proposal_id FROM ( SELECT proposal_id, sort_work_id FROM Devices GROUP BY proposal_id, sort_work_id) Q GROUP BY Q.proposal_id HAVING Count(*)=2 AND SUM(CASE WHEN Q.sort_work_id IN (1,2) 1 ELSE 0 END)=2 //строгое HAVING Count(*)>=2 AND SUM(CASE WHEN Q.sort_work_id IN (1,2) 1 ELSE 0 END)=2 //не строгое |