sql - Oracle如何根据月份数对列求和
问题描述
我有一个基于 fyr、fund、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;
解决方案
您可以unpivot
在第一步中获取数据,然后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
order by col
重要的是要考虑作为逻辑技巧。
推荐阅读
- c# - C# 中日文/中文字符的令牌无效或编译时错误
- chart.js - 在 ChartJS 上禁用 x 和 y 值的显示
- javascript - 无法使用 2 条有点相似的 XMLHttpRequest 获得相同的结果
- c# - Essential Objects WebView 如何在 HTML-tree 中导航?
- javascript - 执行 ODataModel submitChanges 函数后,部分数据丢失
- php - 我的 XAMPP 服务器在我的项目中间停止工作
- jquery - 使用jQuery通过表单数据上传文件时出错
- github - 将 VuePress 部署到 GitHub 页面
- android - W/System.err:java.net.SocketTimeoutException:AndroidQ 中的 SSL 握手超时
- node.js - Telegram 新版本-发送投票 API