【问题标题】:Use SUM value of the highest months使用最高月份的 SUM 值
【发布时间】:2021-04-20 22:22:55
【问题描述】:

我们需要获取 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);

【问题讨论】:

  • 请用足够的样本数据构建一个 db fiddle,以便我们测试可能的解决方案。
  • 嗨,我添加了样本数据、当前结果和预期结果。谢谢!
  • 两整行样本数据?
  • @faujong 请不要在问题的编辑中发布答案;如果您想自行回答问题,请将答案作为答案发布。我将回滚您的问题,您可以将其作为答案发布。

标签: sql oracle oracle11g sum partition


【解决方案1】:

您可以使用条件聚合:

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小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多