2017-06-16 61 views
2

在MS Access中學習SQL,查詢和RDBMS功能後,我剛剛開始使用Oracle系統,因此請耐心等待。我創建了使用case語句樞轉的數據庫列與和平衡,這是工作的罰款查詢,例如:在新列中總結案例陳述的結果Oracle

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 

什麼是這樣做的最佳方式?

編輯:舒展的目標 - 我想創建一個運行總計新創建的「網」列的

回答

1

一種方式來做到這一點是把它包起來外層查詢

SELECT q.*, repaid - disbursed AS net 
    FROM (
    -- your query goes in here 
) q 
+0

我能做的基本上是同樣的事情正在運行的總淨柱,採用了第三選項由上面的@Allan和OVER()分區劃分? –

4

你將使用分析查詢(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聲明中總結了同一列中,casenet可以簡單地包括兩個值:

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 
+0

謝謝!選項A的作品,但不是總和,如果有一個空值的分散或Repaid.Option乙不起作用,這可能是我的錯,因爲我有幾個連接我沒有提到我的WHERE子句。選項C完美地工作,並且是最簡單的。即使Disbursed或Repaid列中存在空值,它也會進行求和。 –

+0

我已編輯答案,以使前兩個解決方案工作,如果'sum'返回一個null。 – Allan

+0

選項A現在可以正常工作,但我仍然更喜歡選項C,因爲如果我需要更改代碼,它是最容易更改的選項。你不會碰巧知道如何創建一個淨列的運行總數,是嗎? –