在oracle中的case或decode语句中使用sum

时间:2014-09-19 11:20:47

标签: sql oracle case

我试着寻找线索,但在任何地方都没有得到令人满意的答案。

我的问题是我有一个巨大的select语句,几乎有一半的列来自子查询,在这些子查询中我必须检查很多东西。

我知道oracle在聚合函数方面是严格的,但是当我在其中一个子查询中尝试这样的东西时,我得到了预期的ouptut:

SELECT DECODE(NVL(SUM(Qty1),0),0,SUM(Qty2),SUM(Qty1))
FROM test_v
WHERE item_no    = 1234567;

但奇怪的是,当我将其修改为:

SELECT 
DECODE(FLAG,1,SUM(Qty2),SUM(Qty1))
FROM test_v
WHERE item_no    = 1234567;

我收到此错误:

ORA-00937: not a single-group group function
00937. 00000 -  "not a single-group group function"
*Cause:    
*Action:
Error at Line: 9 Column: 8`

为什么它在两个几乎相似的查询中给出不同的结果。我知道可以使用GROUP BY来解决它,但是当我没有在输出中获得任何其他列时,如何决定GROUP BY子句。

我还用这样的CASE语句尝试了这个,但没有用:

SELECT
CASE
WHEN flag = 1 THEN
SUM(Qty2)
WHEN flag = 0 THEN
SUM(Qty1)
END Qty
FROM test_v
WHERE item_no    = 1234567;

我仍然得到同样的错误。

我知道我可以通过使用另一个子查询来计算SUM来覆盖它,但这就像生成在select中的几代子查询一样,我不想因为过度使用子查询而出于审美,性能和个人原因。

任何想法为什么第一个工作,这不???

1 个答案:

答案 0 :(得分:4)

这是产生错误的查询:

SELECT DECODE(FLAG, 1, SUM(Qty2), SUM(Qty1))
FROM test_v
WHERE item_no    = 1234567;

这是一个聚合查询。如果没有group by,结果集中只有一个组,汇总了所有数据。

问题是flag不在聚合函数中。应该使用哪个值?每排都有一个。这就是为什么SQL(通常)要求聚合查询中的所有表达式都需要是聚合函数,除了group by中提到的列。

以下方法可行:

SELECT DECODE(MAX(FLAG), 1, SUM(Qty2), SUM(Qty1))
FROM test_v
WHERE item_no    = 1234567;

注意:我只使用decode()因为它在您的示例查询中。您应该学会使用case