Добавление фильтров в подзапрос из среды выполнения CTE в четыре раза - PullRequest
0 голосов
/ 23 апреля 2019

Я работаю над существующим запросом для отчета SSRS, который сосредоточен на агрегированных данных финансовой помощи, разбитых на 10 агрегаций.Пользователь хочет иметь возможность выбирать учащихся, включенных в эти агрегированные данные, на основе новых и возвращенных и «выбранных для проверки».Для нового / возвращаемого статуса я добавил CTE, чтобы вернуть самую раннюю дату приема для студента.2 из 10 полей данных создаются подзапросом.В течение 3 дней я пытался заставить подзапрос использовать поля CTE для фильтра, но они не будут работать.Либо они игнорируются, либо я получаю ошибку «не по выражению группы».Если я помещаю соединение в CTE в подзапросе, время запроса увеличивается с 45 до 400 секунд.Это не должно быть так сложно!Что мне не хватает?Я добавил некоторый код ... 3 блока работают - paid_something - нет.

with stuStatus as
(select 
person_uid, min(year_admitted) admit_year
from academic_study
where aid_year between :AidYearStartParameter and :AidYearEndParameter 
group by person_uid)
--- above code added to get student information not originally in qry

select
  finaid_applicant_status.aid_year   
  , count(1) as fafsa_cnt           --works
  , sum(                           --works
    case 
      when (
        package_complete_date is not null
       and admit.status      is not null
     ) 
    then 1
  else 0
end
  ) as admit_and_package


 , (select count(*)               --does't work
from (
select distinct award_by_aid_year.person_uid
      from 
       award_by_aid_year
     where 
       award_by_aid_year.aid_year = finaid_applicant_status.aid_year
       and award_by_aid_year.total_paid_amount > 0  )dta
 where 
   (
    (:StudentStatusParameter = 'N' and stuStatus.admit_year = finaid_applicant_status.aid_year)
    OR 
    (:StudentStatusParameter = 'R' and stuStatus.admit_year <> finaid_applicant_status.aid_year)
    OR :StudentStatusParameter = '%'
       )
  ) 
  as paid_something

  , sum(                           --works
    case 
     when exists (
       select 
         1 
    from 
      award_by_person  abp
    where 
      abp.person_uid            = fafsa.person_uid
      and abp.aid_year          = fafsa.aid_year
      and abp.award_paid_amount > 0
  ) and fafsa.requirement is not null
    then 1
  else 0
end
 ) as paid_something_fafsa

from
 finaid_applicant_status
 join finaid_tracking_requirement fafsa
on finaid_applicant_status.person_uid = fafsa.person_uid
and finaid_applicant_status.aid_year  = fafsa.aid_year
and fafsa.requirement                 = 'FAFSA'
  left join finaid_tracking_requirement admit
on finaid_applicant_status.person_uid  = admit.person_uid
and finaid_applicant_status.aid_year   = admit.aid_year
and admit.requirement                  = 'ADMIT'
and admit.status                      in ('M', 'P')
  left outer join stuStatus
on finaid_applicant_status.person_uid = stuStatus.person_uid

where
  finaid_applicant_status.aid_year between :AidYearStartParameter and :AidYearEndParameter 
 and (
   (:VerifiedParameter = '%') OR
   (:VerifiedParameter <> '%' AND finaid_applicant_status.verification_required_ind = :VerifiedParameter)
     )
    and 
           (
            (:StudentStatusParameter = 'N' and (stuStatus.admit_year IS NULL OR stuStatus.admit_year = finaid_applicant_status.aid_year ))
           OR 
           (:StudentStatusParameter = 'R' and stuStatus.admit_year <> finaid_applicant_status.aid_year)
           OR :StudentStatusParameter = '%'
             )
group by
  finaid_applicant_status.aid_year
order by
  finaid_applicant_status.aid_year

1 Ответ

0 голосов
/ 23 апреля 2019

Не уверен, что это поможет, но у вас есть что-то вроде этого:

select aid_year, count(1) c1,
      (select count(1) 
         from (select distinct person_uid 
                 from award_by_aid_year a 
                 where a.aid_year = fas.aid_year))
  from finaid_applicant_status fas
  group by aid_year;

Этот запрос выдает ORA-00904 FAS.AID_YEAR invalid identifier. Это потому, что fas.aid_year вложено слишком глубоко в подзапрос.

Если вы можете изменить свой подзапрос с select count(1) from (select distinct sth from ... where year = fas.year) до select count(distinct sth) from ... where year = fas.year, тогда он может работать.

select aid_year, count(1) c1,
       (select count(distinct person_uid) 
          from award_by_aid_year a 
          where a.aid_year = fas.aid_year) c2
  from finaid_applicant_status fas
  group by aid_year

Здесь упрощенно demo , показывающий нерабочие и рабочие запросы. Конечно, ваш запрос намного сложнее, но это то, что вы можете проверить.

Также, может быть, вы можете использовать dbfiddle или sqlfiddle для настройки тестового примера? Или покажите нам выборочные (анонимизированные) данные и требуемый для них вывод?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...