首页 > 解决方案 > 使用最高月份的 SUM 值

问题描述

我们需要获取 3 个月、一年、三年和五年的数字。如果最早的 period_end_date 小于 12 个月,则以下查询将为 OneY、ThreeY 和 FiveY 返回 0。如何更改查询以使其包含一年、三年、五年内的数字?对于 OneY,如果实体存在的月数少于 12 个月,则将 rt 的 SUM 指定为实体存在的最大月数。

假设实体存在 3 个月:

因此,对于 OneY,分配 rt 3 个月的总和

对于 ThreeY,分配 rt 3 个月的总和

对于 FiveY,分配 rt 3 个月的总和

样本数据:

Entity_id  Period_end_Date  One_Month_value
123        11/30/20         10
123        10/31/20         20

使用以下查询的当前结果:

ThreeM: 30
OneY: 0
ThreeY: 0
FiveY: 0

预期结果

ThreeM: 30
OneY: 30
ThreeY: 30
FiveY: 30

谢谢你。

         SELECT SUM (DECODE (rnk, 2, rt, 0)) as ThreeM,
            SUM (DECODE (rnk, 11, rt, 0)) as OneY,
            SUM (DECODE (rnk, 35, rt, 0)) as ThreeY,
            SUM (DECODE (rnk, 59, rt, 0)) as FiveY,
       FROM (SELECT entity_id,
                    rnk,
                    SUM (one_month)
                       OVER (PARTITION BY TRIM (entity_id) ORDER BY rnk)
                       rt
               FROM (  SELECT psm.One_Month_Value,
                              RANK ()
                              OVER (PARTITION BY TRIM (entity_id)
                                    ORDER BY period_end_date DESC)
                                 AS rnk
                         FROM myTbl psm
                        WHERE     TRIM (psm.entity_id) = 123
                              AND period_end_date < '12/31/2020'
                     ORDER BY period_end_date DESC) rank_tab
              WHERE rnk < 60)
      WHERE rnk IN (1,2,11,35,59);

标签: sqloracleoracle11gsumpartition

解决方案


您可以使用条件聚合:

SELECT Entity_id,
       SUM(
         CASE
         WHEN period_end_date >= ADD_MONTHS( TRUNC( SYSDATE, 'YY' ), -3 )
         THEN One_Month_Value
         END
       ) AS ThreeM,
       SUM(
         CASE
         WHEN period_end_date >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -12 )
         THEN One_Month_Value
         END
       ) AS OneY,
       SUM(
         CASE
         WHEN period_end_date >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -36 )
         THEN One_Month_Value
         END
       ) AS ThreeY,
       SUM(
         CASE
         WHEN period_end_date >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -60 )
         THEN One_Month_Value
         END
       ) AS FiveY
FROM   table_name
WHERE  Period_End_Date >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -60 ) 
GROUP BY
       Entity_ID

其中,对于样本数据:

CREATE TABLE table_name ( Entity_id, Period_end_Date, One_Month_value ) AS
SELECT 123, DATE '2020-11-30', 10 FROM DUAL UNION ALL
SELECT 123, DATE '2020-10-31', 20 FROM DUAL UNION ALL
SELECT 1, ADD_MONTHS( DATE '2021-01-31', -LEVEL ), LEVEL FROM DUAL CONNECT BY LEVEL <= 72;

输出:

ENTITY_ID | 三个 | 奥尼 | 三 | 五个
--------: | -----: | ---: | -----: | ----:
      123 | 30 | 30 | 30 | 30
        1 | 6 | 78 | 第666章 1830

db<>在这里摆弄


推荐阅读