Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хитрый запрос на выборку, нужно соблюсти множество условий 
V
    Опции темы
Woodlin
Дата 9.8.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.7.2009
Где: Челябинская облас ть, г. Пласт

Репутация: 1
Всего: 1



Прошу строго не судить.
Собственно история такая. Нужно отобрать записи, у которых хотя бы одна позиция имеет поле Статус = 2, а все остальные Статус = 1 или 4. Но это ладно, поизвращался с подчиненными запросами и худо-бедно нужные записи отбираются. 
Получился вот такой громоздкий запрос.
Код

SELECT Код_Заказы, №_позиции, Статус
FROM Журнал
WHERE (((Журнал.Код_Заказы) In 
(SELECT 
              Журнал.Код_Заказы FROM Журнал 
              WHERE ((Журнал.Код_Заказы In
                           (SELECT Журнал.Код_Заказы 
                            FROM Журнал 
                            WHERE Журнал.Статус=2))
                                     AND (Журнал.Статус=2 Or (Журнал.Статус)=1 Or (Журнал.Статус)=4)))) AND ((Журнал.Статус)<>3)
                                     AND ((Журнал.Статус)<>0)) 
ORDER BY Журнал.Код_Заказы, Журнал.№_позиции;


И хрен бы с ним, громоздкий или негромоздкий я бы так его и оставил, только нарисовалось ещё одно условие, исключить из выборки записи, у которых Статус=2.
Посоветуйте как быть? чтоб ещё и это условие соблюсти.

P.S. Неужто придётся ещё один подзапрос писать, с условием типа: Max(Статус)<>2 and Min(Статус)<>2
PM MAIL ICQ   Вверх
Akina
Дата 9.8.2011, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



А можно всё то же, но более вменяемо? ни хрена ж не понять...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Woodlin
Дата 11.8.2011, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.7.2009
Где: Челябинская облас ть, г. Пласт

Репутация: 1
Всего: 1



Цитата(Akina @  9.8.2011,  20:24 Найти цитируемый пост)
А можно всё то же, но более вменяемо? ни хрена ж не понять... 

 smile 
Нда, с выражовыванием мысли у меня явные проблемы. Попробую снова.

Есть две таблицы: Заказы и Журнал. В Заказы естественно лежат записи заказов. В Журнал находятся позиции заказов (или можно сказать товары) связь с Заказы обеспечивается полем Код_Заказы, каждая позиция заказа имеет определенный статус (поле Статус), к примеру если позиция обсчитана Статус=1 и т.д.

Дальше всё касается только таблицы Журнал, табл. Заказы в запросе не нужна:
В запросе необходимо из табл. Журнал отобрать записи, у которых хотя бы одна позиция (по отношению к Заказы) имеет статус 2, а все остальные позиции заказа со статусом 1,4 (статус может быть и 0 и 3, но эти эти позиции выборке не подлежат). И тут самое интересное, если все позиции заказа имеют Статус=2, то эти записи тоже выборке не подлежат.

...Надеюсь предысторию написал внятно.

Собственно с моего истерического написания первого поста утекло немало времени и получился вот такой запрос.
Код

SELECT Журнал.Код_Заказы, Журнал.№_позиции, Журнал.Статус
FROM Журнал
WHERE 
((Журнал.Код_Заказы 
    In (SELECT Журнал.Код_Заказы FROM Журнал 
              WHERE Журнал.Код_Заказы 
                    In (SELECT Журнал.Код_Заказы FROM Журнал WHERE Журнал.Статус=2)
                                     
          ) And (Журнал.Код_Заказы) Not 
                    In (SELECT Журнал.Код_Заказы FROM Журнал GROUP BY Журнал.Код_Заказы
                          HAVING  Max(Журнал.Статус)=2 AND Min(Журнал.Статус)=2)
  ) AND ((Журнал.Статус)<>3 And (Журнал.Статус)<>0)
)
ORDER BY Журнал.Код_Заказы, Журнал.№_позиции;
 
Возможно может показаться зачем вот так через одно место выбирать записи, но повторюсь, что позиции (товары)  какого то заказа рассматривать нужно в совокупности. К примеру заказ 1, смотрим его позиции, их 5 штук, статусы позиций 1, 2, 3, 2, 4. Получается что позиции этого заказа в выборку попадают, отсекается только позиция со статусом 3.
Например заказ 2, позиций 3 шт, их статусы 1, 4, 1. Позиции этого заказа в выборку не попадают, т.к. нет ни одной позиции со статусом 2.

С таким множеством условий, которые нужно соблюсти в запросе столкнулся в первый раз, прошу его оценить, может есть более рациональное решение.

P.S. Пока писал, подумал, а если статусы позиций заказа только 2 и 3... надо дальше думать.



Это сообщение отредактировал(а) Woodlin - 11.8.2011, 06:56
PM MAIL ICQ   Вверх
Akina
Дата 11.8.2011, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Код

select *
from datatable
group by order
having
  sum(iif(status=2; 1; 0)) > 0
and 
  sum(iif((status=1) or (status=4); 1; 0) > 0

Возможно, потребуется обёртка...

Это сообщение отредактировал(а) Akina - 11.8.2011, 09:32


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Woodlin
Дата 11.8.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.7.2009
Где: Челябинская облас ть, г. Пласт

Репутация: 1
Всего: 1



Akina, использовал Ваш пример, и должен сказать... Я В ШОКЕ!!! как оказывается просто и эффективно можно решить задачу.
PM MAIL ICQ   Вверх
Akina
Дата 11.8.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Woodlin @  11.8.2011,  11:55 Найти цитируемый пост)
как оказывается просто и эффективно можно решить задачу. 

Вы просто забыли о сути SQL, отдавшись логике... переведите запрос на русский язык:

Выбрать всё из database, сгруппированное по order и имеющее суммарно status=2 больше нуля и status=1 либо 4 больше нуля.

Ведь это по сути постановка задачи, но написанная просто, ясно и понятно, без лишних слов... если сначала вот так поставить задачу, а потом перевести на английский - запрос практически готов, только немножко допилить до синтаксиса конкретного SQL-диалекта.

PS. Ещё логичнее было вместо sum(iif(status=2; 1; 0)) > 0 попробовать count(status=2) > 0 - но мне было лень проверять, понравится ли это Аксессу.


Это сообщение отредактировал(а) Akina - 11.8.2011, 11:26


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.