2017-06-16 59 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,因为如果我需要更改代码,它是最容易更改的选项。你不会碰巧知道如何创建一个净列的运行总数,是吗? –