簡體   English   中英

在新列Oracle中匯總case語句的結果

[英]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語句中加總同一列,因此netcase可以簡單地包含兩個值:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM