【问题标题】:Calculate cumulative monthly and year value starting from given MTD and YTD从给定的 MTD 和 YTD 开始计算累积的月度和年度值
【发布时间】:2018-02-01 12:02:58
【问题描述】:

我有以下数据:

Name  | Production_day | tonnes |  MTD  | YTD
------------------------------------------
 gas  | 06/Aug/17      | 2047   | 15000 | 48000 
 gas  | 07/Aug/17      | 1547   |       | 
 gas  | 08/Aug/17      | 1747   |       | 
 gas2 | 06/Aug/17      | 3047   | 15050 | 48800 
 gas2 | 07/Aug/17      | 5547   |       | 
 gas2 | 08/Aug/17      | 9747   |       | 

我已经给出了 MTD 和 YTD,我需要从给定的 MTD 和 YTD 开始计算累积的月和年吨值。

期望的结果,例如gas,MTD=15000+1547,YTD=48000+1547 等:

Name  | Production_day | tonnes |  MTD  | YTD
------------------------------------------
 gas  | 06/Aug/17      | 2047   | 15000 | 48000 
 gas  | 07/Aug/17      | 1547   | 16547 | 49547
 gas  | 08/Aug/17      | 1747   | 18294 | 51294
 gas2 | 06/Aug/17      | 3047   | 15050 | 48800 
 gas2 | 07/Aug/17      | 5547   |       | 
 gas2 | 08/Aug/17      | 9747   |       | 

我可以通过下面的查询轻松做到这一点,但如何告诉从给定的 MTD 和 YTD 开始计算?:

select name,PRODUCTION_DAY, tonnes, sum(tonnes) over (partition by name,  to_char(PRODUCTION_DAY, 'MON-YYYY') order by PRODUCTION_DAY ) MTD from  MV_D_MAS_LASTYEAR order by name, PRODUCTION_DAY 

谢谢, S

【问题讨论】:

  • 编辑您的问题并显示所需的结果。
  • 你应该使用 group by 语句

标签: sql oracle oracle11g


【解决方案1】:

使用累积和定义组。然后将这些组用于累积总和:

select m.*,
       (sum(tonnes) over (partition by name, ytd_grp order by production_day) +
        max(ytd) over (partition by name, ytd_grp)
       ) as running_ytd,
       (sum(tonnes) over (partition by name, mtd_grp order by production_day) +
        max(mtd) over (partition by name, mtd_grp)
       ) as running_mtd
from (select m.*,
             sum(case when ytd is not null then 1 else 0 end) over (partition by name order by production_day) as ytd_grp,
             sum(case when mtd is not null then 1 else 0 end) over (partition by name order by production_day) as mtd_grp,
      from MV_D_MAS_LASTYEAR m
     ) m
order by name, PRODUCTION_DAY 

【讨论】:

  • 感谢 Gordon 的回复,它给出了以下错误: [错误] 执行 (55: 16): ORA-00937: not a single-group group function。总和(ytd 应按功能分组的情况?
  • 我用过这个:select name, PRODUCTION_DAY, TONNES, sum(MTD) over (partition by name, to_char(PRODUCTION_DAY, 'MON-YYYY') order by PRODUCTION_DAY) MTD, sum(YTD)超过(按名称分区,to_char(PRODUCTION_DAY, 'YYYY') 按 PRODUCTION_DAY 排序) YTD 从(从 MV_XHQ_DMAS_LAST6MONTH 选择 NAME,PRODUCTION_DAY,TONNES, TONNES MTD, TONNES YTD 其中 NET_MASS_YTD_MTON 为空 union select NAME,PRODUCTION_DAY,TONNES, NET_MASS_MTD_MTON,NET_MASS_YTD_MTON来自 MV_XHQ_DMAS_LAST6MONTH 其中 NET_MASS_YTD_MTON 不为空)按名称排序,PRODUCTION_DAY
猜你喜欢
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 2017-03-27
  • 2020-05-02
相关资源
最近更新 更多