sql - 使用最高月份的 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);
解决方案
您可以使用条件聚合:
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<>在这里摆弄
推荐阅读
- google-apps-script - 如何使用自定义函数 ExtractAllRegex() 作为数组公式?[谷歌表格]
- python - 如何在时间日期之后对我的数据框进行排序?为什么它是那种磨损的?
- c++11 - 如何使用唯一指针创建矩阵?
- linux - 查找名称相似但日期不同的 linux 文件
- javascript - 如何编写“延迟”的苗条组件?
- security - red5 服务器的安全标头(开源) - 无嗅探、XSS 保护等
- sql - 使用 () OVER 或 HAVING 子句获取每月计数汇总
- amazon-web-services - AWS ECS Spring Boot 共享列表
微服务实例之间 - html - CSS将孩子增长到父母的最大宽度
- arduino - 我怎样才能在串行监视器上只打印一次