0

我在这里使用组函数进行简单查询。这是查询

SELECT DECODE (DIRAPP, NULL, 'SML', DIRAPP) DD
  FROM (SELECT      'At Director Approval '
                 || NVL (COUNT (*), 0)
                 || ' Cheques of Rs. '
                 || NVL (TO_CHAR (SUM (BPV_AMT), '9,999,999,999'), 0)
                 || ' in '
                 || CONCATENATE_LIST
                                 (CURSOR (SELECT DISTINCT NVL
                                                             (BPV_DTE,
                                                              SYSDATE
                                                             ) BPV_DTE
                                                     FROM CHECK_DATA
                                                    WHERE STA_FLG IN (1, 3)
                                                 ORDER BY 1 DESC
                                         )
                                 ) DIRAPP
            FROM CHECK_DATA
           WHERE STA_FLG IN (1, 3)
        GROUP BY 1, 2) A

我已经使用了 nvl 函数并且还进行了解码,但是当没有针对标志 1 和 3 找到任何数据时,即使0从 nvl 也没有显示任何内容,并且还在工作 decode。我想用 as 显示整个字符串,At Director Approval 0 Cheques of Rs.0请任何人帮我这样做

4

1 回答 1

3

decode没有损坏,它只是没有数据可以使用。您正在过滤where sta_flg in (1,3),因此如果没有任何状态的记录,则根本没有行。你无法解码不存在的东西。

解决此问题的一种方法是更改​​您对值进行计数和求和的方式,以便在 中有效地完成过滤select,而不是在where. 暂时删除格式,而不是执行以下操作:

SELECT COUNT(*), SUM(BPV_AMT)
FROM check_data
WHERE sta_flag IN (1,3);

...如果没有具有匹配标志的记录,它将不返回任何行,即使表中有其他数据,您也可以这样做:

SELECT SUM(CASE WHEN sta_flg IN (1,3) THEN 1 ELSE 0 END) AS rec_cnt,
    SUM(CASE WHEN sta_flg IN (1,3) THEN bpv_amt ELSE 0 END) AS bpv_amt_tot
FROM check_data;

只要表不为空,这将返回单行数据,具有正常值或两者兼有rec_cntbpv_amt_tot设置为零。

将其作为内部选择插入,您的查询可能如下所示:

SELECT 'At Director Approval '
    || rec_cnt
    || ' Cheques of Rs. '
    || TO_CHAR(bpv_amt_tot, '9,999,999,999')
    || CASE WHEN rec_cnt = 0 THEN NULL
        ELSE ' in ' || CONCATENATE_LIST(CURSOR(
            SELECT DISTINCT NVL(bpv_dte, SYSDATE)
            FROM check_data
            WHERE sta_flg IN (1, 3)
            ORDER BY 1 DESC
        )) END AS dirapp
FROM (
    SELECT SUM(CASE WHEN sta_flg IN (1,3) THEN 1 ELSE 0 END) AS rec_cnt,
        SUM(CASE WHEN sta_flg IN (1,3) THEN bpv_amt ELSE 0 END) AS bpv_amt_tot
    FROM check_data
);

case周围的部分' in ' || CONCATENATE_LIST(...只是为了避免in在没有匹配状态时出现尾随。

由于您没有选择任何非聚合列,因此不需要group by子句。(无论如何,您所拥有的那个是不正确的-您不能按列位置group by 1,2分组,因此按两个常量值分组也是如此,这不会添加任何内容)。

最后,由于您使用的是concatenate_list()我假设您使用的是早于 11gR2 的版本;如果您使用的是当前版本,那么内置listagg()会更简单。

于 2012-08-30T11:12:14.833 回答