我有一個表格以下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