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_MONTH
和 HOT_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_YEAR
或 HOT_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
我需要根据一些 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_MONTH
和 HOT_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_YEAR
或 HOT_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