![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите пожалуйста правильно составить запрос. [D6, Sybase]
r9000 © (2006-12-25 06:10:00)Добрый день!
Изменяю запрос в котором изначально выводятся все записи с кодами AnalyticType=15 and AnalyticCode=2. Мне необходимо чтобы в результирующий набор не включались записи с кодами AnalyticType=15 и AnalyticCode=2,если промежуток между датами для записей с этим кодами был меньше или равен 180 дням.
SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )
group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue
Правильно ли я написал запрос? Он таким должен быть?
SELECT RecAn.AnalyticCode ,
AnCode.AnCodeValue ,
count(C.Recipient)
FROM
PlacesOfWork A ,
Companies,Recipients C,
PensionContracts P,
RecipientAccounts R,
RecipientAnalyticCodes RecAn,
AnalyticCodesByDate AnCode
where A.Company = Companies.Company
and A.Recipient =C.Recipient
and C.Recipient =P.Recipient
and P.RecipientAccount=R.RecipientAccount
and RecAn.Recipient=C.Recipient
and (AnCode.AnalyticType=RecAn.AnalyticType and AnCode.AnalyticCode=RecAn.AnalyticCode )
---это то что я вставил
and not exists (select * from RecipientAnalyticCodes RecAn,PensionContracts P,
RecipientAccounts R where RecAn.Recipient=C.Recipient and AnalyticType=15 and AnalyticCode=2
and P.RecipientAccount=R.RecipientAccount and C.Recipient =P.Recipient
and datediff(day,R.LastOperDate,'09.01.2006' )<=180)
---это то что я вставил
group by AnCode.AnalyticType,RecAn.AnalyticCode,AnCode.AnCodeValue
ЮЮ (2006-12-25 07:14:00) [21]Мимо, '09.01.2006' - 31.12.05 = 10 дней.
Т.е. тебя совершенно не интересуют записи
1) после 09.01.2006, независимо от срока
2) в интервале (09.01.2006 - 180) ... 09.01.06
т.е. на дату 09.01.2006 тебя интересуют записи раньше 13.07.05 ?
r9000 (2006-12-25 07:05:00) [22]Первую запись с
AnalyticType AnalyticCode LastOperDate
15 2 31.12.05
включаем в результирующий набор, так как
'09.01.2006' -LastOperDate>180, остальные записи должны быть исключены
, так как '09.01.2006' -LastOperDate<=180
ЮЮ (2006-12-25 07:00:00) [23]Короче, хватит умничать, на пальцах лучше покажи :) Итак, для одного реципиента имеем несколько записей
AnalyticType AnalyticCode LastOperDate
15 2 31.12.05
15 2 08.01.06
15 2 09.01.06
15 2 09.05.06
15 2 09.10.06
и некую дату 09.01.06. Какие записи надо исключит (оставить) и почему
r9000 (2006-12-25 06:48:00) [24]Только для этих кодов справедливо это условие
r9000 (2006-12-25 06:47:00) [25]Нет необходимо исключить записи с кодами AnalyticType=15 и AnalyticCode=2,если промежуток между датами для записи с этими кодами был меньше или равен 180 дням
ЮЮ (2006-12-25 06:46:00) [26]
> r9000 (25.12.06 06:36) [2]
Тогда, похоже, всё просто сводится к подсчету тех записей, у которых R.LastOperDate >= '08.07.2006' ?
ЮЮ (2006-12-25 06:38:00) [27]Может задачу можно свести к следующей: "Для каждоой пары RecAn.AnalyticCode и AnCode.AnCodeValue не реже, чем каждые 180 дней должна появляться запись в RecipientAccounts. И нас интересуют такие пары, для которой "свежей" записи до сих пор (на текущую дату) нет" ?
r9000 (2006-12-25 06:36:00) [28]Между датой '09.01.2006' и датой R.LastOperDate записи
ЮЮ (2006-12-25 06:28:00) [29]
> промежуток между датами для записей с этим кодами был меньше или равен 180 дням
datediff(day,R.LastOperDate,'09.01.2006' )<=180)
так между записямиили
последней записью и указанной датой '09.01.2006'