2016-08-05 2 views
0

Я работаю с двумя таблицами в этом запросе Table 1: admit, Table 2: Billing. Что я хочу сделать, это показать людям, которые допущены к нашим кризисным услугам (program codes '44282' and '44283'). Для этих людей я хочу показать свою страховку, которая находится под полем guarantor_id в таблице фактурирования. Для этого мне нужно показать ВСЕ действительные даты максимального покрытия cov_effective_date, где дата вступления в силу составляет менее даты приема preadmit_admission_date, а срок действия покрытия cov_expiration_date больше, чем дата приема (или является нулем). Код, который у меня есть сейчас, делает все, что я хочу, но не получает всех максимальных сроков действия. Поэтому, если у кого-то было два разных страховки, которые начались в тот же день, он будет показывать только один, и я хочу, чтобы он показывал оба.Выбор ВСЕ МАКС. ВАРИАНТЫ SQL-запрос

Select 
A.patid 
,A.episode_number 
,A.preadmit_admission_date 
,A.program_code 
,A.program_value 
,A.c_date_of_birth 
,A.guarantor_id 
,max(A.cov_effective_date) as "MaxDate" 

from(

Select 
    SA.patid 
,SA.episode_number 
,SA.preadmit_admission_date 
,SA.program_code 
,SA.program_value 
,SA.c_date_of_birth 
,BGE.guarantor_id 
,BGE.cov_effective_date 

From System.view_episode_summary_admit as "SA" 

Left Outer Join 

(Select 
    BG.patid 
    ,BG.episode_number 
    ,BG.guarantor_id 
    ,BG.cov_effective_date 
    ,BG.cov_expiration_date 

    from System.billing_guar_emp_data as "BG" 

    Inner Join 

    (Select patid, episode_number, preadmit_admission_date 
    from System.view_episode_summary_admit) as "A" 
    On 
    (A.patid = BG.patid) and (A.episode_number = BG.episode_number) 

    Where 
    BG.cov_effective_date <= preadmit_admission_date and 
(BG.cov_expiration_date >= preadmit_admission_date or 
    BG.cov_expiration_date Is Null) 
) as "BGE" 
    on 
(BGE.patid = SA.patid) and (BGE.episode_number = SA.episode_number) 

    Where 
    (program_code = '44282' or program_code = '44283') 
    and preadmit_admission_date >= {?Start Date} 
    and preadmit_admission_date <= {?End Date} 
    ) A 

    Group By Patid, Episode_number 
+0

Извините, что вовремя, или это будет полный ответ. Этот запрос не будет работать на большинстве языков SQL и будет вызывать ошибку. При использовании aggreagtes вам нужны все неагрегатные столбцы в группе. MySQL любит пропускать ошибку и произвольно захватывать значения для столбцов, не входящих в группу. Поэтому давайте избавимся от этой совокупности. У вас есть подзапрос вниз ... напишите подзапрос, который получает максимальную дату по вашему ключу, присоедините его к остальной части вашего утверждения и обратитесь к нему оттуда. Если вам нужна дополнительная помощь, у меня будет что-то за пару часов для вас. – Twelfth

+0

@Twelfth Хорошо, спасибо! Я буду работать над этим. – Hound

+0

@Twelfth Я пробовал следовать вашим инструкциям, но мне по-прежнему не удается заставить мой запрос работать. Если у вас еще есть время, я бы с удовольствием посмотрел, что вы придумали! – Hound

ответ

1

Извините, что это такой письменный ответ.

Select (your fields) 
from (your entire query)bg 
left join 
    (select patid, max(cov_effective_date) maxdate from system.billing_guar_emp_data group by patid) maxdate 
on maxdate.patid = bg.patidate 

Удалите группу для бай от агрегата ... Теперь вы можете обратиться к maxdate.maxdate как поле в Вашем вступительном заявлении выберите. Может быть, лучше всего присоединиться к этому maxdate, чем присоединиться к самому концу запроса (возможно, прямо под BG в инструкции from), но код psuedo правильно? :) Надеюсь, вы можете применить концепцию, сообщите мне, что я свободен (свободнее?) Днем, если вам нужно больше.

+0

Sweet, я изменил левое соединение на внутреннее соединение и присоединился к номеру эпизода, а также к дате, а также к patid, и это сработало! Спасибо за помощь! – Hound

Смежные вопросы