Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.02.2019, 14:22
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию 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
Изображения
Тип файла: png Untitled.png (5.8 Кбайт, 0 просмотров)
Ответить с цитированием
  #2  
Старый 11.02.2019, 21:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,051
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

С нестрогим поиском все понятно. Запрос с условием 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
В чем суть. В запросе выбираюься записи с типм работ соотв. переданному в in списку, далее группируются по proposal_id и фильтруются по кол-ву. Т.е. если у тебя в списке 2 типа работ (помним, что этот вариант подразумевает, что для одной заявки оин тип работ может быть указан только один раз), то мы проверяем, что у нас всего 2 записи (ровно 2).

Теперь, если типы работ могут повторяться.
Фактически, мы сводим задачу к предыдущей путем "сворачивания" пары 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  
Старый 12.02.2019, 17:36
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Вот тут еще вариант:

Код:
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  //не строгое
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter