我有一个表格以下ddl。添加行,运行计数,运行总和以查询结果
CREATE TABLE "LEDGER"
("FY" NUMBER,
"FP" VARCHAR2(20 BYTE),
"FUND" VARCHAR2(20 BYTE),
"TYPE" VARCHAR2(2 BYTE),
"AMT" NUMBER
)
该表格包含以下数据。
REM INSERTING into LEDGER
SET DEFINE OFF;
Insert into LEDGER (FY,FP,FUND,TYPE,AMT) values (15,'03','A','03',1);
Insert into LEDGER (FY,FP,FUND,TYPE,AMT) values (15,'04','A','03',2);
Insert into LEDGER (FY,FP,FUND,TYPE,AMT) values (16,'04','A','03',3);
Insert into LEDGER (FY,FP,FUND,TYPE,AMT) values (12,'05','A','04',6);
基于FY,FP,基金和类型的划分,我想编写一个查询保持运行计数从FP的开头(FP虽然它是它代表了一个月数为varchar 。iE 2等于二月,三等于三月等)到14的硬数。因此,仔细查看数据,您会注意到在15财年,最大期限为04,所以我必须在我的报告中再增加10个期间让我的报告有完整的14个时期。这里是预期的产出。
这是我的尝试,但我只是简单地在这一切磕磕绊绊。
WITH fy_range AS
(
SELECT MIN (fy) AS min_fy
, MAX (fy) AS max_fy
FROM ledger
),all_fys AS
(
SELECT min_fy + LEVEL - 1 AS fy
FROM fy_range
CONNECT BY LEVEL <= max_fy + 1 - min_fy
)
,all_fps AS
(
SELECT TO_CHAR (LEVEL, 'FM00') AS fp
FROM dual
CONNECT BY LEVEL <= 14
)
SELECT
FUND
,G.TYPE
,G.FY
,G.FP
,LAST_VALUE(G.AMT ignore nulls) OVER (PARTITION BY G.FUND ORDER BY Y.FY P.FP) AS AMT
FROM all_fys y
CROSS JOIN all_fps p
LEFT OUTER JOIN LEDGER G PARTITION BY(FUND)
ON g.fy = y.fy
AND g.fp = p.fp;
但我最终得到了一堆空值和一些奇怪的结果。
那么你有什么企图? – OldProgrammer
@OldProgrammer我在问题 – Miguel
下面添加了我的尝试,我不明白......如果FP应该是一个月(2 = 2月),那么它为什么会穿过14而不是12穿过?也许风云旨在代表一年,你需要“计数”来贯穿次年的二月?或者是什么?另一个问题是,如果你需要一个由FY,FP,Fund和Type划分的“跑步数”,为什么FY = 12的计数从10开始,然后保持在10?这既不是一个数字,也不是一笔数额,它似乎不是一个“跑步”数。 (我假设你想要一个正在运行的SUM,而不是COUNT,但是你需要更多地解释) – mathguy