我在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"柱
答案 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