Skip to content
Advertisement

Oracle calculate YTD ,PYTD, QTD , PQTD , MTD, PMTD

My query is

select 
ENTRIES,
SUM( CASE WHEN to_char(to_date(record_date, 'yyyy/mm/dd'),'YYYY') =2020
                 THEN ENTRIES END )         AS "Curr Yr ENTRIES" ,
SUM( CASE WHEN to_char(to_date(record_date, 'yyyy/mm/dd'),'YYYY') =2019
                 THEN ENTRIES END )         AS "PREV Yr ENTRIES" ,
SUM( CASE WHEN to_char(to_date(record_date, 'yyyy/mm/dd'),'MM') =11
                 THEN ENTRIES END ) AS "Current Month ENTRIES" ,
SUM( CASE WHEN to_char(to_date(record_date, 'yyyy/mm/dd'),'MM') =10
                 THEN ENTRIES END ) AS "PREV Month ENTRIES" ,
SUM( CASE WHEN to_char(to_date(record_date, 'yyyy/mm/dd'),'MM') =09
                 THEN ENTRIES END ) AS "PREV TO PREV Month ENTRIES" ,
SUM( CASE WHEN to_char(to_date(record_date,'yyyy/mm/dd'), 'Q')=4
                 THEN ENTRIES END ) AS "Curr Qtr ENTRIES"  ,
SUM( CASE WHEN to_char(to_date(record_date,'yyyy/mm/dd'), 'Q')=3
                 THEN ENTRIES END ) AS "PREV Qtr ENTRIES" 
from market
group by ENTRIES

Im new to oracle and in my query i have hard coded the values of year ,month and quarter. But i want my query to work without giving any value so that it automatically picks value let me know how can it be done.

Advertisement

Answer

You can use:

SELECT ENTRIES,
       SUM(
         CASE
         WHEN record_date >= TRUNC( SYSDATE, 'YYYY' )
         AND  record_date <  ADD_MONTHS( TRUNC( SYSDATE, 'YYYY' ), 12 )
         THEN ENTRIES
         END
       ) AS "Curr Yr ENTRIES",
       SUM(
         CASE
         WHEN record_date >= ADD_MONTHS( TRUNC( SYSDATE, 'YYYY' ), -12 )
         AND  record_date <  TRUNC( SYSDATE, 'YYYY' )
         THEN ENTRIES
         END
       ) AS "Prev Yr ENTRIES",
       SUM(
         CASE
         WHEN record_date >= TRUNC( SYSDATE, 'MM' )
         AND  record_date <  ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), 1 )
         THEN ENTRIES
         END
       ) AS "Curr Month ENTRIES",
       SUM(
         CASE
         WHEN record_date >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
         AND  record_date <  TRUNC( SYSDATE, 'MM' )
         THEN ENTRIES
         END
       ) AS "Prev Month ENTRIES",
       SUM(
         CASE
         WHEN record_date >= TRUNC( SYSDATE, 'Q' )
         AND  record_date <  ADD_MONTHS( TRUNC( SYSDATE, 'Q' ), 3 )
         THEN ENTRIES
         END
       ) AS "Curr Qtr ENTRIES",
       SUM(
         CASE
         WHEN record_date >= ADD_MONTHS( TRUNC( SYSDATE, 'Q' ), -3 )
         AND  record_date <  TRUNC( SYSDATE, 'Q' )
         THEN ENTRIES
         END
       ) AS "Prev Qtr ENTRIES"
from market
group by ENTRIES

(Although I’m not convinced you want the initial ENTRIES, in the SELECT clause or the final GROUP BY and, instead, could just SUM over the entire period.)

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement