我试着寻找线索,但在任何地方都没有得到令人满意的答案。
我的问题是我有一个巨大的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中的几代子查询一样,我不想因为过度使用子查询而出于审美,性能和个人原因。
任何想法为什么第一个工作,这不???
答案 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
。