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 からでも何も表示されず、デコードも機能At Director Approval 0 Cheques of Rs.0しています。

4

1 に答える 1

3

decode動作するデータがないだけです。でフィルタリングしてwhere sta_flg in (1,3)いるため、いずれかのステータスのレコードがない場合、行はまったくありません。存在しないものを解読することはできません。

これを回避する 1 つの方法は、値のカウントと合計の方法を変更して、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_cntに設定された 1 行のデータを返します。bpv_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グループ化することはできません.2つの定数値でグループ化すると、何も追加されません)。

最後に、あなたが使用しているconcatenate_list()ので、11gR2 より前のバージョンを使用していると思います。現在のバージョンを使用している場合、組み込みはlistagg()より簡単になります。

于 2012-08-30T11:12:14.833 に答える