Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle如何基于月数对列求和_Sql_Oracle_Sum - Fatal编程技术网

Sql Oracle如何基于月数对列求和

Sql Oracle如何基于月数对列求和,sql,oracle,sum,Sql,Oracle,Sum,我有一个基于fyr、基金、glkey、globject的1-12个月的汇总表。我遇到的问题是将该行的月份汇总到给定的月份数。我可以添加一个Case表达式来添加 WHEN 2 then m01 + m02 WHEN 12 then m01 + m02 .. m12 有人知道循环或更好的方法来实现这一点吗 我创建的函数传递它4的月值应该是2537.50,但我得到15741.09 CREATE OR REPLACE FUNCTION gla_sum_asof_month (

我有一个基于fyr、基金、glkey、globject的1-12个月的汇总表。我遇到的问题是将该行的月份汇总到给定的月份数。我可以添加一个Case表达式来添加

WHEN  2 then  m01 + m02 
WHEN 12 then  m01 + m02 .. m12 
有人知道循环或更好的方法来实现这一点吗

我创建的函数传递它4的月值应该是2537.50,但我得到15741.09

    CREATE OR REPLACE FUNCTION gla_sum_asof_month (
    fyr   IN NUMBER  , fund  IN NUMBER  , au    IN CHAR
  , acct  IN NUMBER  , sacct IN NUMBER  , mnth  IN NUMBER  )
  RETURN NUMBER
  IS
  rtn_amt NUMBER(18,2) := 0;
  amt NUMBER(18,2) := 0;
BEGIN
SELECT SUM(amt) INTO rtn_amt FROM (
  SELECT *
    FROM   app_reports.vw_glamounts 
  UNPIVOT
   (
     amt  FOR fmonth
     IN (m01 AS 1, m02 AS 2, m03 AS 3, m04 AS 4 , m05 AS 5 , m06 AS 6,
         m07 AS 7, m08 AS 8 , m09 AS 9, m10 AS 10, m11 AS 11, m12 AS 12)
    )
   ) a
    WHERE  a.Fiscal_Year            = fyr
          AND    a.company          = fund
          AND    a.acct_unit        = au
          AND    a.account          = acct
          AND   a. sub_account      = sacct
          AND   a.fmonth            <= mnth;  -- filter # of months

   RETURN rtn_amt;
END gla_sum_asof_month;
您可以在第一步中取消pivot数据,然后通过条件聚合进行透视:

with t2 as
(
select fyr, fund, glkey, globject, 
       row_number() over (order by col) as rn,
       sum(val) over (order by col) as m 
  from t
 unpivot 
 (
  val for col in (m01 , m02, m03, .., m12)
 )  
)
select fyr, fund, glkey, globject,
       max(case when rn = 1 then m end) as m01,
       max(case when rn = 2 then m end) as m02,
       ...
       max(case when rn =12 then m end) as m12
  from t2
 group by fyr, fund, glkey, globject
顺序排序对于逻辑来说是很重要的。


一个更好的方法是规范化您的数据模型,不如选择使用聚合,使用月和?过期-非常类似于@a_horse_with_no_name所说的数据建模问题,这样您就不需要m01 m02等约束,我也会看看UNPIVOT是否有帮助。我创建了一个从SQL调用的函数。我创建了一个从SQL调用的函数,但当我调用它时,得到的数字不符合我期望的任何值。如果我只在函数中运行SQL,那么它是正确的。我试着发布代码,但窗口太小了。我该怎么做才能发布代码?它只有26行,但超过了允许的字符数。