[英]Sum the results of case statement in a new column Oracle
在學習了MS Access中的SQL,查詢和RDBMS功能之后,我才剛剛開始使用Oracle系統,因此請耐心等待。 我已經創建了一個使用case語句的查詢,以旋轉數據庫列和總余額,效果很好,如下所示:
Date Disbursed Repaid
3/1/17 -1000 500
3/2/17 -2500 1500
我需要做的是添加一列“凈額”,該列匯總每個日期的已付款和已償還金額。 我已經進行了一些挖掘,解決方案似乎是使用OVER()子句,但是我發現的每個示例都過於簡單化,我不知道如何將其轉換為我自己的查詢。 這是我的查詢中case語句的示例:
SELECT TableA.ACTDATETIME as "Date",
sum( case when tableA.code='NDSB' then tableA.amt end) AS Disbursed,
sum( case when tableA.code='SPMT' then tableA.amt end) AS Repaid
我正在尋找的輸出看起來像這樣:
Date Disbursed Repaid Net
3/1/17 -1000 500 -500
3/2/17 -250 1500 1250
最好的方法是什么?
編輯:伸展目標-我想創建一個新創建的“凈”列的運行總計
如果要在保留單個行值的同時對多個行進行分組,則可以使用解析查詢( over
)。 那不是你在做什么。
有兩種解決方法:
首先,您可以簡單地將這兩種情況加在一起:
SELECT tablea.actdatetime AS actdate,
SUM (CASE WHEN tablea.code = 'NDSB' THEN tablea.amt END) AS disbursed,
SUM (CASE WHEN tablea.code = 'SPMT' THEN tablea.amt END) AS repaid,
COALESCE(SUM (CASE WHEN tablea.code = 'NDSB' THEN tablea.amt END), 0)
+ COALESCE(SUM (CASE WHEN tablea.code = 'SPMT' THEN tablea.amt END), 0)
AS net
FROM tablea
GROUP BY actdatetime
或者,如果您不想重復case
語句,則可以使用子查詢:
SELECT actdate,
disbursed,
repaid,
COALESCE(disbursed, 0) + COALESCE(repaid, 0) AS net
FROM (SELECT tablea.actdatetime AS actdate,
SUM (CASE WHEN tablea.code = 'NDSB' THEN tablea.amt END)
AS disbursed,
SUM (CASE WHEN tablea.code = 'SPMT' THEN tablea.amt END)
AS repaid
FROM tablea
GROUP BY actdatetime)
兩者之間的性能差異不太可能,因此請選擇您更喜歡的一個。
仔細研究一下您的查詢,在這種情況下,還有第三種選擇。 由於您要在兩個case
語句中加總同一列,因此net
的case
可以簡單地包含兩個值:
SELECT tablea.actdatetime AS actdate,
SUM (CASE WHEN tablea.code = 'NDSB' THEN tablea.amt END) AS disbursed,
SUM (CASE WHEN tablea.code = 'SPMT' THEN tablea.amt END) AS repaid,
SUM (CASE WHEN tablea.code IN ('NDSB', 'SPMT') THEN tablea.amt END)
AS net
FROM tablea
GROUP BY actdatetime
一種方法是將其包裝在外部查詢中
SELECT q.*, repaid - disbursed AS net
FROM (
-- your query goes in here
) q
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.