Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Помогите с запросом на выборку!  [new]
Benzin
Member

Откуда:
Сообщений: 523
Таблицы "Заказ", "Состав заказа", "Склад".
"Состав заказа" содержит артикулы по каждому Заказу.
Каждая ее запись связана с таблицей "Склад".
В табл. "Склад" есть поле "ДатаСклада". В нем либо дата прихода артикула, либо Null. Артикулы одного Заказа могут иметь одинаковую "ДатаСклада"(пришли одновременно), разные даты(пришло все, но частями), даты + Null(что-то еще не пришло), Null(ничего не пришло).
Надо сотворить запрос, который показывал бы состояние Заказа на произвольную дату выборки. Т.е типа "пришел весь", "не весь", "не пришел".
Бился пол-дня, ничего не выходит.
29 ноя 04, 18:52    [1145071]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Запрос буду делать без учета склейки таблиц, считаю что для этого есть отдельный сохраненный запрос z1 (id_zakaz, artikul)

z2:
Select id_zakaz, count(1) as zakaz_cnt, sum(iif(isnull(artikul), 0, 1) as real_cnt
from z1
group by id_zakaz

z3:
Select id_zakaz, iif(real_cnt = 0, 'пустой', iif(real_cnt = zakaz_cnt, 'полный', 'частичный')) as sost
From z2

?
30 ноя 04, 09:14    [1145651]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
PS: В z2 закрывающей скобки не хватает
30 ноя 04, 09:15    [1145654]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
Benzin
Member

Откуда:
Сообщений: 523
Что-то не выходит.
Не понял каким должен быть исходный запрос Z1?
Урезанная таблица "Состав заказа":
3 поля составного ключа(связь с "Заказы"), Артикул, IDСклад(связь с "Склад").
Урезанная таблица "Склад":
IDСклад, ДатаСклада.
Выражение isnull(artikul) никогда не равно Null - каждая запись "Состав заказа" уж артикул точно содержит...
30 ноя 04, 15:57    [1147509]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
Пардон, замени артикул на [ДатаСклада]

Т.е. - идея такая
В z2 я считаю реальное число позиций заказа и уже пришедшее число позиций,
а в z3 просто сравниваю эти 2 числа!

PS: не надо пытаться тупо копировать запрос и уповать на его работоспособность, т.к.:
1. на форуме все люди, а людям как известно свойственно ошибаться
2. вы понимаете суть своей проблемы, а читающий может и не все понять (или не до конца) - в связи с чем увеличивается вероятность ошибки
3. у нас нет ваших данных, следовательно мы не можем всесторонне проверить работоспособность запросов - из чего следует, что запросы часто пишутся на "коленке"
30 ноя 04, 17:31    [1147917]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
Benzin
Member

Откуда:
Сообщений: 523
C принципом отбора разобрался - спасибо!
А к чему дату выборки присобачить?
Если отбирать только по ДатаСклада, то в отобранное попадают все записи, где это поле равно Null.
Надо добавить еще условие ЗаказДата <= Дата выборки, чтоб не вылезали "будущие" заказы, так что-ли?
1 дек 04, 13:31    [1149641]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
Benzin
Member

Откуда:
Сообщений: 523
C принципом отбора разобрался - спасибо!
А к чему дату выборки присобачить?
Если отбирать только по ДатаСклада, то в отобранное попадают все записи, где это поле равно Null.
Надо добавить еще условие ЗаказДата <= Дата выборки, чтоб не вылезали "будущие" заказы, так что-ли?
1 дек 04, 13:39    [1149661]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
Benzin
Member

Откуда:
Сообщений: 523
А вот отбор по ДатаСклада напрочь губит такой красивый способ:
z2 (c учетом исправлений):
Select id_zakaz, count(1) as zakaz_cnt, sum(iif(isnull(ДатаСклада), 0, 1) as real_cnt
from z1
group by id_zakaz
при этом запрос z1 выглядел так:
Select СоставЗаказа.id_zakaz, СоставЗаказа.artikul, Склад.ДатаСклада
FROM Склад RIGHT JOIN СоставЗаказа ON Склад.IDСклад = СоставЗаказа.IDСклад
Если теперь в запросе z1 добавить условие: ДатаСклад <= ДатаОтбора, то пропадут какие-то строки, соответственно в запросе z2 будет неправильно считаться выражение Count(1), ну и дальше пойдут ошибки.
И опять я вернулся к своему разбитому корыту!!!
1 дек 04, 16:49    [1150283]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
автор
Если теперь в запросе z1 добавить условие: ДатаСклад <= ДатаОтбора, то пропадут какие-то строки, соответственно в запросе z2 будет неправильно считаться выражение Count(1), ну и дальше пойдут ошибки.
И опять я вернулся к своему разбитому корыту!!!

(ДатаСклад <= ДатаОтбора) Or (ДатаСклад Is Null)
?
1 дек 04, 17:54    [1150535]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
Benzin
Member

Откуда:
Сообщений: 523
Зацените, получается монстр:
запрос z1
Select СоставЗаказа.id_zakaz, СоставЗаказа.artikul, Склад.ДатаСклада
FROM Склад RIGHT JOIN СоставЗаказа ON Склад.IDСклад = СоставЗаказа.IDСклад
запрос z2, число строк в Заказе
Select id_zakaz, count(1) as zakaz_cnt
from z1
group by id_zakaz
запрос z11,как z1, но с отбором по дате
Select СоставЗаказа.id_zakaz, СоставЗаказа.artikul, Склад.ДатаСклада
FROM Склад RIGHT JOIN СоставЗаказа ON Склад.IDСклад = СоставЗаказа.IDСклад
WHERE [ДатСклада]<= дата отбора
запрос z21, число строк в возможно урезанном Заказе
Select id_zakaz, count(1) as zakaz_cnt
from z11
group by id_zakaz
итоговый запрос
SELECT z2.id_zakaz, [z2]![zakaz_cnt]-nz([z21]![zakaz_cnt],[z2]![zakaz_cnt]+1) AS qwerty,
 IIf([qwerty]>0,'часть',IIf([qwerty]=-1,'пусто','весь')) AS Выражение1
FROM z21 RIGHT JOIN z2 ON z21.id_zakaz = z2.id_zakaz
может чего упростить можно?
1 дек 04, 18:07    [1150578]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
И так нормально :)
1 дек 04, 18:09    [1150585]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом на выборку!  [new]
Benzin
Member

Откуда:
Сообщений: 523
Конечно:
(ДатаСклад <= ДатаОтбора) Or (ДатаСклад Is Null)
, но только это не спасает, пришлось сотворить "монстра"
1 дек 04, 18:10    [1150591]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить