Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите пожалуйста правильно составить запрос. [D6, Sybase]


Страницы:   1 2

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'


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо