Question : Group by Error when using a CASE statement

I have the following query and would like to group by the CASE statement column:


SELECT   ot.emPlId,
         Sum(ot.tr_hrs_To_Payroll),
         CASE
           WHEN tRans_dt >= jb.Hire_dt THEN To_char(ot.tRans_dt,'YYYYMMDD')
           ELSE To_char(ot.tRans_dt,'YYYYMMDD')
         END AS trandate,
         ot.erncd
FROM     ps_tr_wrk_oThearns ot,
         ps_Job jb
WHERE    ot.emPlId = jb.emPlId
AND jb.effdt = (SELECT MAX(jb1.effdt)
                FROM   ps_Job jb1
                WHERE  jb1.emPlId = jb.emPlId
                AND jb1.emPl_rcd = jb.emPl_rcd
                AND jb1.effdt <= To_date('2007-10-10','YYYY-MM-DD'))
AND jb.effseq = (SELECT MAX(jb2.effseq)
                 FROM   ps_Job jb2
                 WHERE  jb2.emPlId = jb.emPlId
                 AND jb2.emPl_rcd = jb.emPl_rcd
                 AND jb2.effdt = jb.effdt)
AND ot.erncd IN ('GHD','GCD','VC1','VC2',
                 'VH1','VH2','HC1','HC2',
                 'HH1','HH2','SC1','SC2',
                 'SH1','SH2')
AND ot.tr_InterFace_Id IN ('TC','TAW','OTE')
AND ot.tr_Passed_PaySheet IN (SELECT DISTINCT a.Activity_dt
                              FROM   ps_tr_RunId_dtl a,
                                     ps_tr_RunId_dtl b
                              WHERE  b.Activity_dt = To_date('2007-09-21','YYYY-MM-DD')
                              AND a.Run_Id = b.Run_Id)
AND ot.tr_ProcessIng_Flag = 'P'
AND ot.tr_hrs_To_Payroll <> 0
AND ot.tRans_dt >= To_date('2007-01-01','YYYY-MM-DD')
gROUP BY ot.emPlId, trandate,ot.erncd;

I receive the following error "trandate" : invalid identifier.

Thanks is advance

Answer : Group by Error when using a CASE statement

Use the case instead:
SELECT   ot.emPlId,
         Sum(ot.tr_hrs_To_Payroll),
         CASE
           WHEN tRans_dt >= jb.Hire_dt THEN To_char(ot.tRans_dt,'YYYYMMDD')
           ELSE To_char(ot.tRans_dt,'YYYYMMDD')
         END AS trandate,
         ot.erncd
FROM     ps_tr_wrk_oThearns ot,
         ps_Job jb
WHERE    ot.emPlId = jb.emPlId
AND jb.effdt = (SELECT MAX(jb1.effdt)
                FROM   ps_Job jb1
                WHERE  jb1.emPlId = jb.emPlId
                AND jb1.emPl_rcd = jb.emPl_rcd
                AND jb1.effdt <= To_date('2007-10-10','YYYY-MM-DD'))
AND jb.effseq = (SELECT MAX(jb2.effseq)
                 FROM   ps_Job jb2
                 WHERE  jb2.emPlId = jb.emPlId
                 AND jb2.emPl_rcd = jb.emPl_rcd
                 AND jb2.effdt = jb.effdt)
AND ot.erncd IN ('GHD','GCD','VC1','VC2',
                 'VH1','VH2','HC1','HC2',
                 'HH1','HH2','SC1','SC2',
                 'SH1','SH2')
AND ot.tr_InterFace_Id IN ('TC','TAW','OTE')
AND ot.tr_Passed_PaySheet IN (SELECT DISTINCT a.Activity_dt
                              FROM   ps_tr_RunId_dtl a,
                                     ps_tr_RunId_dtl b
                              WHERE  b.Activity_dt = To_date('2007-09-21','YYYY-MM-DD')
                              AND a.Run_Id = b.Run_Id)
AND ot.tr_ProcessIng_Flag = 'P'
AND ot.tr_hrs_To_Payroll <> 0
AND ot.tRans_dt >= To_date('2007-01-01','YYYY-MM-DD')
gROUP BY ot.emPlId,CASE
           WHEN tRans_dt >= jb.Hire_dt THEN To_char(ot.tRans_dt,'YYYYMMDD')
           ELSE To_char(ot.tRans_dt,'YYYYMMDD')
         END,ot.erncd;

Random Solutions  
 
programming4us programming4us