2017-06-16 2 views
2

MS AccessでSQL、クエリ、およびRDBMSの機能を学んだ後、Oracleシステムを使用し始めたばかりです。私はこのように、正常に動作しているデータベースの列と合計残高を旋回するようにcase文を使用してクエリを作成している:私が行う必要がある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 

これを行うための最善の方法は何ですか?

EDIT:ストレッチゴール - 私はそれを行うには

答えて

1

一つの方法は、外側のクエリ

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

私は3番目のオプションを使用して、ネットコラムのランニング合計基本的に同じことを行うことができます上の@AllanとOVER()のパーティションは? –

4

にあなたをそれをラップすることです新たに作成した「ネット」欄の累計を作成したいのですが個々の行の値を保持しながら複数の行からグループ値を実行する場合は、分析クエリ(over)を使用します。それはあなたがやっていることではありません。

これについて移動する2つの方法があります。あなたは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, 
      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 

をまたは:

まず、あなたは、単に一緒に2例を追加することができますサブクエリを使用することができます。

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) 

があり2間の性能差ではないようですので、あなたがより良い好きな方を選択します。


この場合、もう少し近いところでクエリを見ると、3番目のオプションがあります。あなたは両方の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 
+0

ありがとう!オプションAは動作しますが、DisbursedまたはRepaid.Option Bのnull値がある場合は加算されません.Option Bは機能しません。これはおそらく私のWHERE句のために言及しなかったいくつかの結合を持っているためです。オプションCは完璧に動作し、最も簡単でした。 Disbursed列またはRepaid列のいずれかにヌル値があっても合計します。 –

+0

「sum」がnullを返す場合、最初の2つのソリューションを動作させるための答えを編集しました。 – Allan

+0

オプションAは正しく動作しますが、コードを変更する必要がある場合は最も簡単に変更されるため、オプションCを使用することをお勧めします。あなたはネットコラムの実行中の合計を作成する方法を知っていないでしょうか? –

関連する問題