在新列Oracle中汇总case语句的结果

时间:2017-06-16 16:00:59

标签: sql oracle

我在MS Access中学习SQL,查询和RDBMS功能后刚开始使用Oracle系统,所以请耐心等待。我已经使用case语句创建了一个查询来转动数据库列和总和余额,这样可以正常工作,如下所示:

Date    Disbursed Repaid
3/1/17  -1000     500
3/2/17  -2500     1500

我需要做的是添加一个名为" Net"的列。其中包括每个日期的已支付和已偿还金额。我已经完成了一些挖掘,解决方案似乎是使用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

这样做的最佳方式是什么?

编辑:拉伸目标 - 我想创建一个新创建的" Net"柱

2 个答案:

答案 0 :(得分:4)

如果要在保留单个行值的同时从多行中执行组值,则可以使用分析查询(this.$refs.canvas.getContext('2d') )。这不是你正在做的事情。

有两种方法可以解决这个问题:

首先,您可以简单地将两个案例一起添加:

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的{​​{1}}可能只包含这两个值:

case

答案 1 :(得分:1)

一种方法是将其包装为外部查询

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