Помещение оператора case в функцию max () и оператор where - PullRequest
0 голосов
/ 15 апреля 2020


У меня есть этот оператор case, в котором я получаю измененный столбец stop_time как Stop_TimeNEW

select 
        case
            when Stop_Time is null then sysdate
            else Stop_Time
        end as Stop_TimeNEW
from TEMPTABLE;

И я хотел бы использовать это значение Stop_TimeNEW в этом операторе select всякий раз, когда он говорит «Stop_Time».

Select sum(minutes)
 From (
        Select Distinct 
               B.DateR1
              ,B.DateR2
              , (((extract(DAY FROM DateR2-DateR1)*24*60*60)+ 
                (extract(HOUR FROM DateR2-DateR1)*60*60)+
                (extract(MINUTE FROM DateR2-DateR1)*60)+
                extract(SECOND FROM DateR2-DateR1)))/60 as minutes
         From TempTable A
         Cross Apply (
                      Select
                            Min(Start_Time) as DateR1
                            ,max(Stop_Time) as DateR2
                       From  TempTable 
                       Where Start_Time <= A.Stop_Time and Stop_Time >= A.Start_Time 
                     ) B
 ) A

Я пытался сделать это, но это не сработало

Select sum(minutes)
 From (
        Select Distinct 
               B.DateR1
              ,B.DateR2
              , (((extract(DAY FROM DateR2-DateR1)*24*60*60)+ 
                (extract(HOUR FROM DateR2-DateR1)*60*60)+
                (extract(MINUTE FROM DateR2-DateR1)*60)+
                extract(SECOND FROM DateR2-DateR1)))/60 as minutes
         From TempTable A
         Cross Apply (
                      Select
                            case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW,
                            Min(Start_Time) as DateR1
                            ,max(Stop_TimeNEW) as DateR2
                       From  TempTable 
                       Where Start_Time <= A.Stop_TimeNEW and Stop_TimeNEW >= A.Start_Time 
                     ) B
 ) A

И

Cross Apply (
                      Select
                            case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW,
                            Min(Start_Time) as DateR1
                            ,max(case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW) as DateR2
                       From  TempTable 
                       Where Start_Time <= (select case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW from a) and (select case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW from temptable) >= A.Start_Time 
                     ) B

Интересно, кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Прежде всего

** Выберите

CASE, когда Stop_Time равен нулю, а затем sysdate

else Stop_Time

заканчивается как Stop_TimeNEW, .... .. From TempTable

Где Start_Time <= A.Stop_TimeNEW и Stop_TimeNEW> = A.Start_Time **

не будет работать так, как в порядке выполнения Предложение «Где» выполняется до SELECT и AS, это означает, что пока WHERE выполняется в вашем коде, он даже не знает, что Stop_TimeNEW еще не создан. Я предлагаю вам использовать подзапрос, чтобы сделать то же самое

SELECT Stop_TimeNEW ,Min(Start_Time) as DateR1 ,max(Stop_TimeNEW) as DateR2 FROM (Select A.*, CASE WHEN Stop_Time is null then sysdate ELSE Stop_Time END AS Stop_TimeNEW From TempTable A) Where Start_Time <= A.Stop_TimeNEW and Stop_TimeNEW >= A.Start_Time

0 голосов
/ 15 апреля 2020

Возможно, вам нужна функция NVL (которая обрабатывает нулевое значение). Попробуйте запрос ниже -

Select sum(minutes)
 From (
        Select Distinct 
               B.DateR1
              ,B.DateR2
              , (((extract(DAY FROM DateR2-DateR1)*24*60*60)+ 
                (extract(HOUR FROM DateR2-DateR1)*60*60)+
                (extract(MINUTE FROM DateR2-DateR1)*60)+
                extract(SECOND FROM DateR2-DateR1)))/60 as minutes
         From TempTable A
         Cross Apply (
                      Select
                            Min(Start_Time) as DateR1
                            ,MAX(NVL(Stop_Time, sysdate)) as DateR2
                       From  TempTable 
                       Where Start_Time <= A.Stop_Time and Stop_Time >= A.Start_Time 
                     ) B
 ) A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...