Select 查询以降序获取去年月份与当年数据

Select Query to fetch last year months to descending order with current year data

我需要根据一些 table 数据生成过去 24 个月的图表。 年月日(entry_date)分别存储在table中。现在我想获取最近 24 个月的数据并且工作正常,我需要替换 降序 中的重新订购月份数字。例如。当前月份是 12,所以将其更改为 1。因此 2019 年 1 月应该是 24。 这是我试过的。

SELECT 
AREA_CODE,
HOT_YEAR,HOT_MONTH,ENTRY_DATE,
ROUND(SUM(AREA_TOTAL_PERCENTAGE/TOTAL_TRAINEE),2) AS PERCENTAGE FROM(
SELECT COUNT(TRAINEE_ID)AS TOTAL_TRAINEE,HOT_YEAR,HOT_MONTH, AREA_ID,AREA_CODE,ENTRY_DATE,SUM(AREA_TOTAL_PERCENTAGE) AREA_TOTAL_PERCENTAGE FROM(
    SELECT 
    H.TRAINEE_ID,
    H.AREA_ID,
    HR.HOT_MONTH,
    HR.HOT_YEAR,
    HR.ENTRY_DATE,
    A.AREA_CODE,
    SUM(HR.TRAINING_PERCENTAGE) AS AREA_TOTAL_PERCENTAGE
    FROM TR_IDP_HOT_REPORT HR
    INNER JOIN TR_IDP_HOT H ON H.HOT_ID=HR.HOT_ID
    INNER JOIN TM_AREA A ON A.AREA_ID=H.AREA_ID
    WHERE HR.ENTRY_DATE BETWEEN ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), -24) AND SYSDATE
    GROUP BY   H.AREA_ID, HR.HOT_YEAR,HR.HOT_MONTH, H.TRAINEE_ID, A.AREA_CODE, HR.ENTRY_DATE)
    GROUP BY AREA_ID, AREA_CODE, AREA_ID, HOT_YEAR,HOT_MONTH,ENTRY_DATE
    )WHERE AREA_CODE='BR' GROUP BY  AREA_ID,AREA_CODE,HOT_YEAR,HOT_MONTH, ENTRY_DATE
    ORDER BY AREA_ID,HOT_YEAR,HOT_MONTH;

以上查询将产生以下输出,我正在寻找的更改标记在 red

您需要使用一个条件,其中 HOT_MONTHHOT_YEAR 是过去的 12 个月然后需要计算值如下:

-- use following case expression in outer most select clause
CASE 
  WHEN MONTHS_BETWEEN(TRUNC(SYSDATE, 'MONTH'), 
                      TRUNC(TO_DATE(HR.HOT_YEAR || LPAD(HR.HOT_MONTH,2,'0'), 'YYYYMM', 'MONTH'))) > 12
  THEN MONTHS_BETWEEN(TRUNC(SYSDATE, 'MONTH'), 
                      TRUNC(TO_DATE(HR.HOT_YEAR || LPAD(HR.HOT_MONTH,2,'0'), 'YYYYMM', 'MONTH'))) + 1 -- ACCORDING TO REQUIREMENT +1 CAN BE USED
  ELSE HR.HOT_MONTH 
END 

你想要这样的东西:

SELECT AREA_CODE,
       HOT_YEAR,
       EXTRACT( YEAR FROM SYSDATE ) * 12 + EXTRACT( MONTH FROM SYSDATE ) + 1
       - HOT_YEAR * 12 - HOT_MONTH AS hot_month,
       ENTRY_DATE,
       ROUND(SUM(AREA_TOTAL_PERCENTAGE/TOTAL_TRAINEE),2) AS PERCENTAGE
FROM   (
  SELECT COUNT(TRAINEE_ID)AS TOTAL_TRAINEE,
         AREA_ID,
         AREA_CODE,
         HOT_YEAR,
         HOT_MONTH,
         ENTRY_DATE,
         SUM(AREA_TOTAL_PERCENTAGE) AREA_TOTAL_PERCENTAGE
  FROM   (
    SELECT H.TRAINEE_ID,
           H.AREA_ID,
           HR.HOT_MONTH,
           HR.HOT_YEAR,
           HR.ENTRY_DATE,
           A.AREA_CODE,
           SUM(HR.TRAINING_PERCENTAGE) AS AREA_TOTAL_PERCENTAGE
    FROM   TR_IDP_HOT_REPORT HR
           INNER JOIN TR_IDP_HOT H ON H.HOT_ID=HR.HOT_ID
           INNER JOIN TM_AREA A ON A.AREA_ID=H.AREA_ID
    WHERE  HR.ENTRY_DATE BETWEEN ADD_MONTHS(TRUNC(SYSDATE, 'MONTH'), -24) AND SYSDATE
    AND    A.AREA_CODE = 'BR'
    GROUP BY
           H.AREA_ID,
           H.TRAINEE_ID,
           A.AREA_CODE,
           HR.HOT_MONTH,
           HR.HOT_YEAR,
           HR.ENTRY_DATE
  )
  GROUP BY
         AREA_ID,
         AREA_CODE,
         AREA_ID,
         HOT_MONTH,
         HOT_YEAR,
         ENTRY_DATE
)
GROUP BY
       AREA_ID,
       AREA_CODE,
       HOT_YEAR,
       HOT_MONTH,
       ENTRY_DATE
ORDER BY
       AREA_ID,
       ENTRY_DATE;

(注意:如果它们总是相同的月份和年份那么你不需要存储 HOT_YEARHOT_MONTH 因为它们可以从 ENTRY_DATE 并且 GROUP BY 中不需要它们,因为 ENTRY_DATE 更具体。)

db<>fiddle here

我推测你只是想要 row_number():

select 
    area_code,
    hot_year,
    hot_month,
    entry_date,
    round(sum(area_total_percentage/total_trainee), 2) as percentage
    row_number() over(order by hot_year desc, hot_month desc) as new_hot_month
from ( ... )
where area_code = 'BR'
group by area_id, area_code, area_id, hot_year,hot_month, entry_date
order by area_code, hot_year, hot_month