【问题标题】:Oracle Subselect in NVL (Group By required)NVL 中的 Oracle 子选择(需要分组)
【发布时间】:2014-09-08 09:36:54
【问题描述】:

我在 Oracle 中遇到了问题。 我有一个 SQL,其中一些值是固定的。现在我开始用参数表中的值替换它们。其中一些固定值位于 NVL() 中。

简单地说我的说法是这样的。

SELECT NVL(MAX(t.datefield), to_date('01011900','DDMMYYYY'))
FROM table t;

效果很好。

现在我想用子选择将固定日期替换为参数表中的日期,这根本不起作用。

// Works
SELECT NVL(MAX(NULL), 'hello') FROM DUAL;

// Doesn't work
SELECT NVL(MAX(NULL), (SELECT 'hello' FROM DUAL)) FROM DUAL;

错误是:

ORA-00937: .... "not a single-group group function"

我不知道如何按子选择分组。

非常感谢任何帮助!谢谢!

【问题讨论】:

    标签: oracle group-by subquery nvl ora-00937


    【解决方案1】:

    您不能按子选择进行分组。但是,为了实现这一点,您的子选择只能返回一行。因此,将其更改为笛卡尔联接并按此分组。

    SELECT NVL(MAX(NULL), str) 
      FROM DUAL
     CROSS JOIN ( SELECT 'hello' as str FROM DUAL )
     GROUP BY STR
    

    更一般地,未包含在聚合函数中的每一列必须包含在 GROUP BY 中。加号NVL() is bad;请改用COALESCE()CASE

    【讨论】:

    • 太棒了-谢谢一百万!我不知道为什么我没有那样想。对于 Nvl/Coalesce 问题,你是绝对正确的,我只是使用给定的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多